题目一
struct One{ double d; char c; int i; } struct Two{ char c; double d; int i; }
在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是()
A 16 24,16 24
B 16 20,16 20
C 16 16,16 24
D 16 16,24 24
我这里出的问题主要是 #pragma pack(4)这里的问题
struct Two{
char c; // 1
double d; // 因为这里对齐数是4 大小是8 所以说这里的对齐数应该是4 我当时认为还是8 所以应该是 4~11
int i; // 12~15
} 15+1 = 16 可以
我这里错误的原因主要是没搞明白对齐数的问题 要好好复习!!
题目二
设有定义char * p [] ={“Shanghai”,“Beijing”,“Honkong”};则结果为j字符的表达式是()
A *p[1] +3
B *(p[1] +3)
C *(p[3] +1)
D p[3] [1]
这里首先排除C和D
A是先取到字符B 之后字符B加上3 所以说是字符E
B 这里首先是取到数组里的第二个元素 beijing
指针指向首元素 B
加上3之后指向J
所以说最后是J
这里我错应该是当时做的太着急了 没有细细的想
题目三
下列关于C/C++的宏定义,不正确的是()
A 宏定义不检查参数正确性,会有安全隐患
B 宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量
C 宏的嵌套定义过多会影响程序的可读性,而且很容易出错
D 相对于函数调用,宏定义可以提高程序的运行效率
这里我选择是A 原因是看错了选择不正确的
其实这里的答案是B 老师说有点超纲
题目四
设有以下宏定义: #define N 3+1 #define Y(n) ((3+1+1)5+1) 则执行语句 z=2(N+Y(5+1))后,z 的值为()
A 60
B 190
C 248
D 上述答案都不对
这道题目其实很简单 替换下就好
z=2*(3+1+((3+1+1)*5+1))
z = 2*(4+26) = 60
这里错误的原因是没有掌握方法 自己本身也没有认真去研究宏定义还有结构体内存对齐这两章的内容 报应啊
总结
总的来说C语言相关知识掌握的不错
需要在仔细研究下结构体内存对齐还有宏定义题目的做题方法