主题:一个想去去想来就是想不好的问题!!!
onlystudent
[专家分:30] 发布于 2005-06-01 11:10:00
以下就是一个在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个回复)
沙发
feicui [专家分:20] 发布于 2005-06-11 16:54:00
有三个(i++)每一次 i自增1
所以是i=10
至于 j我认为应是27而不是28
板凳
chujidiy [专家分:20] 发布于 2005-06-16 17:04:00
和编译器有关。
编译器决定自加了几次后求和。
3 楼
onlystudent [专家分:30] 发布于 2005-06-19 11:59:00
谢谢你,不管你们的回答是与非但是我也了解了一些!
4 楼
trieyes [专家分:0] 发布于 2005-06-25 12:56:00
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 楼
lyid [专家分:0] 发布于 2005-07-10 08:34:00
至于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;
未分析出原因,望能对你有所帮助.
我来回复