#include "stdio.h"
int main()
{
int i=0,n = 0;
n = (++i)+(++i)+(++i);
printf(" n = %d\n",n);
printf(" i = %d\n",i);
return 0;
}请大家说清楚你的理由。以及你使用的编译工具!
int main()
{
int i=0,n = 0;
n = (++i)+(++i)+(++i);
printf(" n = %d\n",n);
printf(" i = %d\n",i);
return 0;
}请大家说清楚你的理由。以及你使用的编译工具!
在C语言中。这个表达式(++i)+(++i)+(++i)是先把i的值自加三次。然后再把三个i加起来的值赋给n。先增值,后引用。即等价于:
++i;++i;++i;n=i+i+i;
同样。如果是(i++)+(i++)+(i++)则是先引用,后增值,把i+i+i的值赋给n后,i再自加三次。即等价于:
n=i+i+i;++i;++i;++i;
在谭老师的《C程序设计》里面的介绍自加的地方有谈到这个问题。
我会把这个帖子在各个板块转。!
int i=0,n = 0;
n = (++i)+(++i)+(++i);
System.out.println(" n = "+n);
System.out.println(" i = "+i);
n=6,v=3
n = (++i)+(++i)+(++i);
trace(n);
trace(i);n=6; i=3
#include <stdio.h>
int main()
{
int i=0,n = 0;
n = (++i)+(++i);
printf(" n = %d\n",n);
printf(" i = %d\n",i);
return 0;
}n=7
i=3++i的值是1
(++i)+(++i)的值是4
(++i)+(++i)+(++i)的值是7
在tc中是先将i的值自加3次,vc \.net中是从左到右
所以tc中应该是9,vc\.net中应该是6
n = ((++i) + (++i)) + (++i)
7 2 2 3
6
表达式
n = (++i)+(++i)+(++i);
等同于:
n=(i+1)+(i+1+1)+(i+1+1+1);
其中i的值始终是0
让我用STUDIO2003.NET的调试器来分析一下:
相关反汇编代码如下:(各语句后面有我的注释)
int i=0,n = 0;
00411A4E mov dword ptr [i],0 ;i初始化为0
00411A55 mov dword ptr [n],0 ;n初始化为0
n = (++i)+(++i)+(++i);
00411A5C mov eax,dword ptr [i] ;eax=0;
00411A5F add eax,1 ;eax=eax+1,所以eax=1
00411A62 mov dword ptr [i],eax ;把1赋值给i
00411A65 mov ecx,dword ptr [i] ;把i装入ecx,此时ecx=1
00411A68 add ecx,1 ;ecx=ecx+1,此时ecx=2
00411A6B mov dword ptr [i],ecx ;把ecx赋值给i,此时i=2
00411A6E mov edx,dword ptr [i] ;把i装入edx,(edx)=2
00411A71 add edx,1 ;edx=edx+1,(edx)=3
00411A74 mov dword ptr [i],edx ;把edx的置放回i,i=3
00411A77 mov eax,dword ptr [i] ;eax=3
00411A7A add eax,dword ptr [i] ;eax=eax+i=3+3=6
00411A7D add eax,dword ptr [i] ;eax=eax+3=6+3=9
00411A80 mov dword ptr [n],eax ;n=(eax)=9
从以上反汇编过程可以看出,n=9,i=3,输出后也如此。输出的汇编代码就不贴了。
不同的编译器输出的结果可能不同,我想,可能反汇编出来的代码也不一样,所以结果自然也不一样了。
vc 6.0 release 版本:n=9,i=3
++i;
a=i;
++i;
b=a+i;
++i;
c=b+i;2. n=7是这样得到的:
++i;
++i;
a=i+i;
++i;
b=a+i;3. n=9是这样得到的:
++i;
++i;
++i;
a=i+i+i;
for(int j=0;j<10;j++)
{
Data[j]=j;
}
int i=0;
Data[i,i++,i++]=i++
Data[i,i++,i++]=Data[i,i++,i++];for(j=0;j<10;j++)
{
printf("Data[%d]=%d\n",j,Data[j]);
}
(++i)+(++i)+(++i);中3个(++i)是同级运算符,虽然是从右边向左,但是先括号,所以最后就成了
2+2+2=6,此时i=2;不知各位看法如何??