路考通过(20061124) 感恩的心
Nov 29
作者: 肖建彬 | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址: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

One Response to “一个无聊的C程序”

  1. wanggeng Says:

    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

Leave a Reply