phantomI 发表于 2015-9-5 21:04:19

c语言例题

int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
我用程序走了一遍,结果p=15,q=22,为什么出现这种结果求高手指点。

仰望天上的光 发表于 2015-9-5 22:29:20

这种代码用不同的C语言编译器编译出来的程序,执行结果本来就不一样。

快乐呵呵 发表于 2015-9-5 22:31:52

i++:这个是一般用在循环上吧,i++是执行完后面的语句才加1;

而++j就先做j+1才执行后面的语句。(++j)+(++j)+(++j) 这种表达式本身就不符合C语言对代码的要求是毫无意义的这是没有意义的[/color]毫无意义 ≠ 错

下面是vc6的计算 别的编译器不一样,
1 6:    q =(++j)+(++j)+(++j);
2 00401036   mov         eax,dword ptr          移动J=5到寄存器eax内
3 00401039   add         eax,1                                       在寄存器eax值上加1,eax=6
4 0040103C   mov         dword ptr ,eax          把寄存器的值移动到变量j上去,j= 6
5 0040103F   mov         ecx,dword ptr          移动J=6到寄存器ecx
6 00401042   add         ecx,1                                       在寄存器上ecx+1,j=6
7 00401045   mov         dword ptr ,ecx          把寄存器ecx上的值移到J上去,J=7
8 00401048   mov         edx,dword ptr          把J=7移动到寄存器edx=7
9 0040104B   add         edx,dword ptr           edx值+j此时j=7,edx=7+7
10 0040104E   mov         eax,dword ptr           把j=7Move给 第一个寄存器eax
11 00401051   add         eax,1                                       eax再加1,此时寄存器eax=8
12 00401054   mov         dword ptr ,eax          把此时的eax的值move给 j=8
13 00401057   add         edx,dword ptr          edx值= edx+j = 14+8
14 0040105A   mov         dword ptr ,edx      edx值 move给 j = 22

phantomI 发表于 2015-9-6 08:13:09

快乐呵呵 发表于 2015-9-5 22:31
i++:这个是一般用在循环上吧,i++是执行完后面的语句才加1;

而++j就先做j+1才执行后面的语句。(++j)+( ...

看这样好像是先计算前两个括号里的++运算再执行第一个加法运算,然后执行最后一个++运算再加上去是吧?
页: [1]
查看完整版本: c语言例题