前几天看到了一篇有意思的文章,它提出了一个问题.对于代码
1 int i = 3;
2 int j = (++i) + (++i);
3 printf(“%d\n“, j);
2 int j = (++i) + (++i);
3 printf(“%d\n“, j);
最后输出的结果是 ?
代码二
1 int i = 3;
2 int j = (++i) + (++i) + (++i);
3 printf(“%d\n“, j);
2 int j = (++i) + (++i) + (++i);
3 printf(“%d\n“, j);
最后输出的结果是 ? 我想包括我在内的很多人答案会是9和15… 但它给出的答案是10和16; 对于第一道题目,有人这样解释: 分布计算
1 i++;
2 i++;
3 j=i+i;
2 i++;
3 j=i+i;
看起来像凑答案,,,,但想想这样解释也并不是没有道理,因为括号的优先级是最高的. 但日过这样的话,第二道无法解释了. 理应是6+6+6=18,答案却是16… 看到CSDN上有人问类似的题目,得到的答案多是鄙视,没看题目就”I’m dead”,”建议禁止此类幼稚的帖子”,,, 对于这种直接无视-.- sigh~~~~ 当然有人给出了解释分布为:
1 i++;
2 i++
3 j=i+i;
4 i++;
5 j=j+i;
2 i++
3 j=i+i;
4 i++;
5 j=j+i;
并解释说这类问题都可以用贪吃法解决,我查了半天没找到贪吃法的资料… 有人上提示可以查看执行的汇编,VC在调试状态下按Alt+8即可查看当时执行的汇编代码 下面是j = (++i)+(++i)+(++i),执行的汇编代码,后面的数字是标记上去的,
01 .
02 .
03 .
04 .
05 .
06 17: j = (++i)+(++i)+(++i);
07 0040B80D mov ecx,dword ptr [ebp-0Ch]
08 0040B810 add ecx,1
09 0040B813 mov dword ptr [ebp-0Ch],ecx 4
10 0040B816 mov edx,dword ptr [ebp-0Ch]
11 0040B819 add edx,1
12 0040B81C mov dword ptr [ebp-0Ch],edx 5
13 0040B81F mov eax,dword ptr [ebp-0Ch]
14 0040B822 add eax,dword ptr [ebp-0Ch] 10(5+5)
15 0040B825 mov ecx,dword ptr [ebp-0Ch]
16 0040B828 add ecx,1 6
17 0040B82B mov dword ptr [ebp-0Ch],ecx
18 0040B82E add eax,dword ptr [ebp-0Ch] 16(10+6)
19 0040B831 mov dword ptr [ebp-8],eax
20 18: printf( “j: %d, k: %d\r\n”, j, k );
21 .
22 .
23 .
24 .
02 .
03 .
04 .
05 .
06 17: j = (++i)+(++i)+(++i);
07 0040B80D mov ecx,dword ptr [ebp-0Ch]
08 0040B810 add ecx,1
09 0040B813 mov dword ptr [ebp-0Ch],ecx 4
10 0040B816 mov edx,dword ptr [ebp-0Ch]
11 0040B819 add edx,1
12 0040B81C mov dword ptr [ebp-0Ch],edx 5
13 0040B81F mov eax,dword ptr [ebp-0Ch]
14 0040B822 add eax,dword ptr [ebp-0Ch] 10(5+5)
15 0040B825 mov ecx,dword ptr [ebp-0Ch]
16 0040B828 add ecx,1 6
17 0040B82B mov dword ptr [ebp-0Ch],ecx
18 0040B82E add eax,dword ptr [ebp-0Ch] 16(10+6)
19 0040B831 mov dword ptr [ebp-8],eax
20 18: printf( “j: %d, k: %d\r\n”, j, k );
21 .
22 .
23 .
24 .
突然看到有人说在Linux下执行答案是 6+6+6=18…(心拔凉..) 于是得出很汗的结论:这道题目并没有什么深究价值,娱乐便可….关键还是看编译器会把这些C语句转化为怎么样汇编了,但我感觉还是18这个答案比较合适…