菜鸟问题(在线等待回答)

wangtopcool 2002-09-08 08:59:51
为什么两个输出值不同:
1 main()
{
int x=5,y;
printf("%d\n",(x++)+(x++)+(x++));
x=5;
y=(x++)+(x++)+(x++);
printf("%d\n",y);
}
2 main()
{
int x=5,y;
printf("%d\n",(++x)+(++x)+(++x));
x=5;
y=(++x)+(++x)+(++x);
printf("%d\n",y);
}

...全文
57 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nokiacoco 2002-09-13
  • 打赏
  • 举报
回复
学习来喽
snwcwt 2002-09-08
  • 打赏
  • 举报
回复
to wangtopcool(王宝):
迷糊中。。。不过我觉得这种事是看编译器做了什么事情。不知道标准C++有没有对这种情况的说明,呵呵:)
猜测一下:
(x++)+(x++)+(x++):因为有括号,先计算括号内的,但都是先代入后加,所以5+5+5,
(++x)+(++x)+(++x):如wangtopcool(王宝) 所说。首先计算第一个++x,x=6,然后再加上(++x),算括号内x再自加1,x=7,然后7+7,再加上(++x)
这时x=8,7+7+8。但是感觉上这两种解释格格不入:(
gforceca1900 2002-09-08
  • 打赏
  • 举报
回复
http://www.c-view.org/soft/devcpp/devcpp.html
下载地址.
dev我在win XP中运行
wangtopcool 2002-09-08
  • 打赏
  • 举报
回复
to snwcwt(风舞影天):
dev c++可以在WIN下运行,你可以在soft.269.net中下载
wangtopcool 2002-09-08
  • 打赏
  • 举报
回复
晕~~
我用dev c++的结果也是15、22,想不通???请教高手!!!
snwcwt 2002-09-08
  • 打赏
  • 举报
回复
to gforceca1900(钙钙):
dev c++在什么OS下用的啊?是WIN的话我想要一份:)
snwcwt 2002-09-08
  • 打赏
  • 举报
回复
再用BC31,结果和TC20一样;BC50不知跑那儿去了:(
我觉得VC60那样处理有点不爽,有点费解,呵呵
jianweiqiu 2002-09-08
  • 打赏
  • 举报
回复
我现在得出后一段的结果是 22 22
gforceca1900 2002-09-08
  • 打赏
  • 举报
回复
我又用dev c++
结果一样
他们的答案和我不一样!!!????????????????????????????????????????
snwcwt 2002-09-08
  • 打赏
  • 举报
回复
vc60:
第一个程序都为15
第二个程序都为22(why,没想通)
gforceca1900 2002-09-08
  • 打赏
  • 举报
回复
我用vc6.0
gforceca1900 2002-09-08
  • 打赏
  • 举报
回复
前一个是:5+5+5=15,两个都是15.
printf执行后,x将变为8.就是连续三个自加.
后一个是:7+7+8=22,两个都是.
因为前两个数弹出,再弹出一个操作符才进行计算,所以进行两次
++x,x将会为7时才会进行加运算.
如果是
x=5;
y=(++x)+(++x)+(++x)+(++x);
则是:7+7+8+9=31

snwcwt 2002-09-08
  • 打赏
  • 举报
回复
TC20中:表达式(x++)+(x++)+(x++)如果是作为一个实参传递给一个function时,则是应该这样计算的: 5+6+7=18,也就是从前到后先算出X再代入下一个再计算;
y=(x++)+(x++)+(x++);这样的话则是先将5代入,5+5+5=15,然后再依次自加1

(++x)+(++x)+(++x)类似了,作为实参时:6+7+8=21
y=(++x)+(++x)+(++x),先自加然后代入:8+8+8=24
snwcwt 2002-09-08
  • 打赏
  • 举报
回复
这个问题和编译器有关,好象是用tc20,30就出现你所说的情况,vc和bc50就不会。原因是在向一个函数传递(++x)+(++x)+(++x)这样一个表达式和y=(++x)+(++x)+(++x)的算法不同,你可以这样试试:
main()
{
a((++x)+(++x)+(++x));
}
void a(int b)
{
printf("%d", b);
}
最开始我还以为是printf的原因,结果函数传递参数时都会这样:)
再去看看先,很久以前有个朋友问我这个问题也才搞清楚的,现在记不大清楚了
wangtopcool 2002-09-08
  • 打赏
  • 举报
回复
你们以为我是傻B哦,你们说的我都知道,我问的是为什么printf("%d",(++x)+(++x)+(++x))的输出值是24,而Y=(++x)+(++x)+(++x) printf("%d",y)的值是21
poplv 2002-09-08
  • 打赏
  • 举报
回复
很清楚呀!

(x++)+(x++)+(x++)是先将3个x加起来输出。再自加三次。

(++x)+(++x)+(++x)是先自加三次,再将自加后的3个x加起来输出!

owenszp 2002-09-08
  • 打赏
  • 举报
回复
一个是先用后加,另一个是先加后用!建议你好好看看书本!
gongxh 2002-09-08
  • 打赏
  • 举报
回复
第一个使用的是 x++ 它是使用后在增加
geeksky 2002-09-08
  • 打赏
  • 举报
回复
看谭的书看傻了
wangtopcool 2002-09-08
  • 打赏
  • 举报
回复
DEBUG我当然会,那么请问为什么第一个的输出值和Y的不一样,第一个是21,而Y值是24,WHY?
加载更多回复(3)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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