对于 struct X { short s; int i; char c; },sizeof(X) 的值等于 sizeof(s) + sizeof(i) + sizeof(c)
对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
初始化方式 char a[14] = "Hello, world!"; 和初始化方式 char a[14]; a = "Hello, world!"; 的效果相同
在gcc编译器下,对于 int i = 3; printf("%d %d", ++i, ++i),运行输出为:4 5
选项A、B、C、D中至少有两个是正确的
以上选项均不正确
6: printf("%d,%d\n", ++i, ++i); 0040102F mov eax,dword ptr [ebp-4] 00401032 add eax,1 //-------------->3+1 = 4 00401035 mov dword ptr [ebp-4],eax 00401038 mov ecx,dword ptr [ebp-4] 0040103B push ecx //--------------->此时将i = 4压栈 0040103C mov edx,dword ptr [ebp-4] 0040103F add edx,1 //--------------->4+1 = 5 00401042 mov dword ptr [ebp-4],edx 00401045 mov eax,dword ptr [ebp-4] 00401048 push eax //--------------->此时将i= 5压栈 00401049 push offset string "%d,%d\n" (0042401c) 0040104E call printf (004011a0) 00401053 add esp,0Ch
int i = 3; 00325BBE mov dword ptr [i],3 printf("%d,%d\n", ++i, ++i); 00325BC5 mov eax,dword ptr [i] 00325BC8 add eax,1 //------------------>3+1 = 4 00325BCB mov dword ptr [i],eax 00325BCE mov ecx,dword ptr [i] 00325BD1 add ecx,1 //------------------>4+1 = 5 00325BD4 mov dword ptr [i],ecx 00325BD7 mov esi,esp 00325BD9 mov edx,dword ptr [i] 00325BDC push edx //----------------->将5压栈 00325BDD mov eax,dword ptr [i] 00325BE0 push eax //----------------->将5压栈 00325BE1 push 32CC70h 00325BE6 call dword ptr ds:[3301ECh] 00325BEC add esp,0Ch 00325BEF cmp esi,esp 00325BF1 call __RTC_CheckEsp (032132Fh)先进后出原则-----------》输出5,5(vs2013编译器)
内存对齐是一个比较常考察的一个部分。下面的分析都是基于32位机器考虑的。这里要注意两点:
对于题目中的:
struct X { short s; int i; char c; };
其中需要考虑变量s和c的对齐,很容易发现,应该是12。有一些编译器存在对该形式的优化,在实际分配内存的时候,会将该结构体按照如下的结构进行分配:
struct X { short s; char c; int i; };
这样分配的内存会减少到8。
详细分析可以参考blog:http://blog.csdn.net/charles_r_chiu/article/details/47858885中的第26条
这一点应该是课本上的基本常识,是由于双精度丢失,所以只能够采用比较两个差绝对值是否小于一个很小的数字来确定。
int main() { int i = 1; printf("%d,%d\n", ++i, ++i); //3,3 printf("%d,%d\n", ++i, i++); //5,3 printf("%d,%d\n", i++, i++); //6,5 printf("%d,%d\n", i++, ++i); //8,9 system("pause"); return 0; }
首先是函数的入栈顺序从右向左入栈的,计算顺序也是从右往左计算的,不过都是计算完以后在进行的压栈操作:
对于第5行代码,首先执行++i,返回值是i,这时i的值是2,再次执行++i,返回值是i,得到i=3,将i压入栈中,此时i为3,也就是压入3,3;
对于第6行代码,首先执行i++,返回值是原来的i,也就是3,再执行++i,返回值是i,依次将3,5压入栈中得到输出结果
对于第7行代码,首先执行i++,返回值是5,再执行i++返回值是6,依次将5,6压入栈中得到输出结果
对于第8行代码,首先执行++i,返回i,此时i为8,再执行i++,返回值是8,此时i为9,依次将i,8也就是9,8压入栈中,得到输出结果。
但是这种操作是和编译器相关的,详细分析请参考的我的blog:http://blog.csdn.net/charles_r_chiu/article/details/47858885中第三条