【讨论】 大家说说n和i的值。

wltsui 2004-08-06 04:22:36
#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;
}

请大家说清楚你的理由。以及你使用的编译工具!
...全文
302 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltsui 2004-08-09
  • 打赏
  • 举报
回复
to yangl79(杨):讨论它的实际意义是不大,就当轻松一下。
yangl79 2004-08-08
  • 打赏
  • 举报
回复
恕我见识少,我没见过在一行语句中同一变量的自加与自减出现过两次或以后的,除非是那个什么专门写不可读程序的比赛。这个问题考2级的朋友最爱讨论,请问他的用意在哪?我认为有些编译器的作者都认为这个问题没有意义,所以他们随便弄了一些,甚至不故它是否合理了。
talkverygood 2004-08-08
  • 打赏
  • 举报
回复
n=6;i=2;
(++i)+(++i)+(++i);中3个(++i)是同级运算符,虽然是从右边向左,但是先括号,所以最后就成了
2+2+2=6,此时i=2;不知各位看法如何??
untiltarget 2004-08-08
  • 打赏
  • 举报
回复
在solaris 中 n = 9, i = 3,跟.NET/CBX中一样.究竟谁对谁错?
untiltarget 2004-08-08
  • 打赏
  • 举报
回复
晕,这些人说了半天也没有出问题点,我们需要解释的是在vc和gcc中,n为什么等于7,如何解释?
rabo 2004-08-08
  • 打赏
  • 举报
回复
一個真正的程序員是不會寫出這樣的代碼的.
他會努力去避免這些有爭議的問題的.
Cline 2004-08-07
  • 打赏
  • 举报
回复
这种问题好几个月前就问了不少:

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]);
}
ctan 2004-08-07
  • 打赏
  • 举报
回复
首先申明一下, 这个问题意义不大, 纯粹考查编译器的压栈顺序.

实际应用中, 是绝对要避免出现这种代码的, 经常使用这种代码是要丢饭碗的.

这个问题的结果随不同的编译器而得到不同结果, 但运算完的i的值是一样的, 都为3

n的值有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;



Squall1009 2004-08-07
  • 打赏
  • 举报
回复
vc 6.0 n=7,i=3
kvw3000 2004-08-07
  • 打赏
  • 举报
回复
vc 6.0 debug 版本:n=6, i=3
vc 6.0 release 版本:n=9,i=3
kugou123 2004-08-07
  • 打赏
  • 举报
回复
接着写,从我以上的分析可以看出,studio2003.net的编译器,对于(++i)+(++i)+(++i);这种运算,是先算i,也即将三个++i先算出来,结果等于3,然后才算括号外面的加法,结果当然是n=3+3+3=9。
kugou123 2004-08-07
  • 打赏
  • 举报
回复
我在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,输出后也如此。输出的汇编代码就不贴了。
不同的编译器输出的结果可能不同,我想,可能反汇编出来的代码也不一样,所以结果自然也不一样了。
wenwenerya 2004-08-07
  • 打赏
  • 举报
回复
初看到这道题目,就觉得应该是9,3。
gbbword 2004-08-07
  • 打赏
  • 举报
回复
在c#中编译:
6
表达式
n = (++i)+(++i)+(++i);
等同于:
n=(i+1)+(i+1+1)+(i+1+1+1);
其中i的值始终是0
darkstar21cn 2004-08-06
  • 打赏
  • 举报
回复
我觉得n = 7的情况是这么算的
n = ((++i) + (++i)) + (++i)
7 2 2 3
qingyuan18 2004-08-06
  • 打赏
  • 举报
回复
编译器不同,结果也就不同
在tc中是先将i的值自加3次,vc \.net中是从左到右
所以tc中应该是9,vc\.net中应该是6
liyong33 2004-08-06
  • 打赏
  • 举报
回复
n=9
i=3
EternalBlue 2004-08-06
  • 打赏
  • 举报
回复
完全看编译器怎样处理的。。
fzjw 2004-08-06
  • 打赏
  • 举报
回复
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

snowingbf 2004-08-06
  • 打赏
  • 举报
回复
编译器相关,思路不清

差评!
加载更多回复(6)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧