Nov 29
作者: 肖建彬 | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://www.xiaojb.com/archives/it/c-20061129.shtml
网址:http://www.xiaojb.com/archives/it/c-20061129.shtml
int main() {
int i;
int j;
i=0;
j=(++i)+(++i)+(++i);
printf("%d\n", j);
return 0;
}
水木编程版的解释
5、(++i)*(++i)*(++i)的值是多少
和编译器相关,编码推荐不使用这种风格的表达式,愿意研究的请自行研究,本版不讨论。
另:同一变量在一个表达式中两次作为左值出现时,表达式的值不确定。比如,(i++)
+(i++),i=i++
李恺同学的解释
//---code-start--
int main() {
int i;
int j;
i=0;
j=(++i)+(++i)+(++i);
printf("%d\n", j);
}
//---code-end---
运行,出乎意料地输出值为7
分析: 在VC6里DISASM如下,102F~1053段代码表示,
计算j=(++i)+(++i)+(++i)的值,整个式子是加法,从左向右算,先算第一个加号
然而第一个加号两边都是括号表达式,于是先得算出两个表达式的值,
第一个(++i)后i=1,第二个(++i)后,i=2,再进行加法(++i)+(++i)=4,
然后往右,算第二个括号,同样,先得算出(++i)表达式的值,此时i=3,
于是,j=3+4=7
因此得出C的运算顺序,'+'从左到右(从右到左),如果两边是表达式,需先算出表达式的值
/*******disassemble**/
6: i=0;
00401028 mov dword ptr [ebp-4],0
7: j=(++i)+(++i)+(++i);
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,1
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]
00401047 mov eax,dword ptr [ebp-4]
0040104A add eax,1
0040104D mov dword ptr [ebp-4],eax
00401050 add edx,dword ptr [ebp-4]
00401053 mov dword ptr [ebp-8],edx
/******************/
为验证以上猜测,再取下面代码测试,
反汇编明确表示,先取2,再加3,然后算4*5,然后再5+20
这里还得出,加法是从左向右算的
code:
//--s
int a=2,b=3,c=4,d=5;
j=a+b+c*d;
//--e
8: int a=2,b=3,c=4,d=5;
0040D776 mov dword ptr [ebp-0Ch],2
0040D77D mov dword ptr [ebp-10h],3
0040D784 mov dword ptr [ebp-14h],4
0040D78B mov dword ptr [ebp-18h],5
9: j=a+b+c*d;
0040D792 mov ecx,dword ptr [ebp-0Ch]
0040D795 add ecx,dword ptr [ebp-10h]
0040D798 mov edx,dword ptr [ebp-14h]
0040D79B imul edx,dword ptr [ebp-18h]
0040D79F add ecx,edx
0040D7A1 mov dword ptr [ebp-8],ecx
December 1st, 2006 at 16:52
VS2005下是9,这个和括号的解析有关.
int i=0;
004113AE mov dword ptr [i],0
int j=0;
004113B5 mov dword ptr [j],0
j=(++i)+(++i)+(++i);
004113BC mov eax,dword ptr [i]
004113BF add eax,1
004113C2 mov dword ptr [i],eax
004113C5 mov ecx,dword ptr [i]
004113C8 add ecx,1
004113CB mov dword ptr [i],ecx
004113CE mov edx,dword ptr [i]
004113D1 add edx,1
004113D4 mov dword ptr [i],edx
004113D7 mov eax,dword ptr [i]
004113DA add eax,dword ptr [i]
004113DD add eax,dword ptr [i]
004113E0 mov dword ptr [j],eax