316 views

++i是什么

前几天看到了一篇有意思的文章,它提出了一个问题.对于代码

1 int i = 3;
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);

最后输出的结果是 ? 我想包括我在内的很多人答案会是9和15… 但它给出的答案是10和16; 对于第一道题目,有人这样解释: 分布计算

1 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;

并解释说这类问题都可以用贪吃法解决,我查了半天没找到贪吃法的资料… 有人上提示可以查看执行的汇编,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 .

突然看到有人说在Linux下执行答案是 6+6+6=18…(心拔凉..) 于是得出很汗的结论:这道题目并没有什么深究价值,娱乐便可….关键还是看编译器会把这些C语句转化为怎么样汇编了,但我感觉还是18这个答案比较合适…

无觅相关文章插件,快速提升流量

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>