首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个很小的程序,

2012-03-09 
一个很小的程序,请教各位.C/C++ code#include stdio.hmain(){int i,ji3j(++i)+(++i)printf(%d,j)

一个很小的程序,请教各位.

C/C++ code
#include <stdio.h>main(){    int i,j;   i=3;   j=(++i)+(++i);   printf("%d",j);}


i的初值为3,第一次++i的时候,应该变成4,第二次++i的时候应该变成5,应该等于9吧?

[解决办法]
我运行了一下,结果是10,我把它的汇编贴出来了,你看看:
j=(++i)+(++i);
0040102F mov eax,dword ptr [ebp-4]//把3移到eax寄存器中
00401032 add eax,1 //eax寄存器加一,即自增
00401035 mov dword ptr [ebp-4],eax
00401038 mov ecx,dword ptr [ebp-4]
0040103B add ecx,1
0040103E mov dword ptr [ebp-4],ecx
00401041 mov edx,dword ptr [ebp-4]
00401044 add edx,dword ptr [ebp-4] //现在两个寄存器中都是5,加起来为10.
00401047 mov dword ptr [ebp-8],edx
[解决办法]
其实这个问题取决于你的编译器
一般说来,用的AC的标准的话,j=(++i)+(++i)是右结合的,所以应该是先算最后一个++i,是4,再算左边一个++i,是5,但是i是局部变量,导致后面一个i也变成5了,所以结果是5+5=10
但是在unix下,有的编译器的结果可能是9

[解决办法]
这种表达式, 分开写就很容易看清楚, 将
j=(++i)+(++i);
改写成
++i;
++i;
j=i+i;
很显然结果为10

另外建议一下, 尽量不要使用这种表示方式,
现在学校里考试经常考这种题目, 实在是误人子弟

[解决办法]
再见这种有争议的问题,不弄了 。本来这样的计算顺序就与编译器有关。没什么好研究的

热点排行