回 帖 发 新 帖 刷新版面

主题:一个想去去想来就是想不好的问题!!!

以下就是一个在vc 下运行的c 程序,但它的结果就让我......
希望详细指点为谢!
#inlude <stdio.h>
void main()
{
int i=7,j;
  j=(++i)+(++i)+(++i);
  printf("i=%d,j=%d\n",i,j);
}
  


这个结果却是:
  i=10(这个可以想到)
  j=28(就让我百思不得其解)
愿意给我回复的朋友,快一点好?

回复列表 (共5个回复)

沙发

有三个(i++)每一次 i自增1
所以是i=10
至于 j我认为应是27而不是28

板凳

和编译器有关。

编译器决定自加了几次后求和。

3 楼

谢谢你,不管你们的回答是与非但是我也了解了一些!

4 楼

VC 编译28,BC编译27。

VC对++运算符的解释很奇怪,BC的更符合语法。

下面是VC对(i++)+(i++)+i++的汇编代码.

0040102F   mov         eax,dword ptr [ebp-4]
00401032   add         eax,dword ptr [ebp-4]
00401035   add         eax,dword ptr [ebp-4]
00401038   mov         dword ptr [ebp-8],eax
0040103B   mov         ecx,dword ptr [ebp-4]
0040103E   add         ecx,1
00401041   mov         dword ptr [ebp-4],ecx
00401044   mov         edx,dword ptr [ebp-4]
00401047   add         edx,1
0040104A   mov         dword ptr [ebp-4],edx
0040104D   mov         eax,dword ptr [ebp-4]
00401050   add         eax,1
00401053   mov         dword ptr [ebp-4],eax

下面是VC对(++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

可以看出,VC的这种解释很奇怪。我觉得这不符合语法,BC则好得多。

所以在VC中,对同一个语句中对同一个操作数,最多只能使用一次++运算符否则,你就会遇到不可理解的事情。BC中可以随便用。

5 楼

至于i=10就不用说了.
j应该是:j=(1+7)+(1+(1+7))+(1+(1+(1+7)))=27;
但结果是28.


本人用以下方法设置断点跟踪j的value变化:
include <iostream.h>
void main()
{
  int i=7,j=0;
  for (int s=0;s<=2;s++)
  j+=(++i);
  cout<<i<<"  "<<j<<endl;
}
结果为:j=27;
未分析出原因,望能对你有所帮助.

我来回复

您尚未登录,请登录后再回复。点此登录或注册