#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;
}请大家说清楚你的理由。以及你使用的编译工具!

解决方案 »

  1.   

    我用的是TC
    在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程序设计》里面的介绍自加的地方有谈到这个问题。
      

  2.   

    to Asan13(阿才): good!
    我会把这个帖子在各个板块转。!
      

  3.   

    to 不美: 你有老版本的c++ builder吗? 试试。
      

  4.   

    在java中:
         int i=0,n = 0;
         n = (++i)+(++i)+(++i);
         System.out.println(" n = "+n); 
         System.out.println(" i = "+i);  
    n=6,v=3
      

  5.   

    在flash中var i=0,n=0;
    n = (++i)+(++i)+(++i);
    trace(n);
    trace(i);n=6; i=3
      

  6.   

    DEV C++中
    #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
      

  7.   

    编译器不同,结果也就不同
    在tc中是先将i的值自加3次,vc \.net中是从左到右
    所以tc中应该是9,vc\.net中应该是6
      

  8.   

    我觉得n = 7的情况是这么算的
    n = ((++i) + (++i)) + (++i)
    7     2        2        3
      

  9.   

    在c#中编译:
    6
    表达式
    n = (++i)+(++i)+(++i);
    等同于:
    n=(i+1)+(i+1+1)+(i+1+1+1);
    其中i的值始终是0
      

  10.   

    我在VC++.NET下编译通过,结果为:n=9,i=3
    让我用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,输出后也如此。输出的汇编代码就不贴了。
    不同的编译器输出的结果可能不同,我想,可能反汇编出来的代码也不一样,所以结果自然也不一样了。
      

  11.   

    接着写,从我以上的分析可以看出,studio2003.net的编译器,对于(++i)+(++i)+(++i);这种运算,是先算i,也即将三个++i先算出来,结果等于3,然后才算括号外面的加法,结果当然是n=3+3+3=9。
      

  12.   

    vc 6.0 debug 版本:n=6, i=3
    vc 6.0 release 版本:n=9,i=3
      

  13.   

    首先申明一下, 这个问题意义不大, 纯粹考查编译器的压栈顺序.实际应用中, 是绝对要避免出现这种代码的, 经常使用这种代码是要丢饭碗的.这个问题的结果随不同的编译器而得到不同结果, 但运算完的i的值是一样的, 都为3n的值有6,7,9三种结果:1. n=6是这样得到的:
    ++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;
      

  14.   

    这种问题好几个月前就问了不少:int Data[10];
    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]);
    }
      

  15.   

    晕,这些人说了半天也没有出问题点,我们需要解释的是在vc和gcc中,n为什么等于7,如何解释?
      

  16.   

    在solaris 中 n = 9, i = 3,跟.NET/CBX中一样.究竟谁对谁错?
      

  17.   

    n=6;i=2;
    (++i)+(++i)+(++i);中3个(++i)是同级运算符,虽然是从右边向左,但是先括号,所以最后就成了
    2+2+2=6,此时i=2;不知各位看法如何??
      

  18.   

    to yangl79(杨):讨论它的实际意义是不大,就当轻松一下。