中易网

#include<stdio.h> void main() { int y=7; printf("%d%d%d",++y,--y,y++); } 为什么第一个是7?

答案:3  悬赏:0  
解决时间 2021-02-13 19:02
#include<stdio.h> void main() { int y=7; printf("%d%d%d",++y,--y,y++); } 为什么第一个是7?
最佳答案
这是二元运算符的问题,运算顺序从运算符右边到左边
所以会先算--y得到第二个数为6
再算第一个数++y得到7
最后算y++得到7
下面的运算符都是从右到左

有问题请追问

!
~
++
--
-
+
*
&
全部回答

这个在c语言标准中,并没有规定参数y的计算时间点,所以计算结果跟编译器厂家的执行顺序有关,实际工作中也不会出现这种代码, 这种代码写出来会被骂的;

不要纠结此类问题, 类似的问题还有

i++++, ++i++, i+++i,这种;看到就烦;

既然你问了,那我就说了;

c语言默认的参数入栈顺序是从右往左,

也就是 y++,--y,++y;这个顺序入栈; 理论上也是这个计算顺序;

y++表达式的值是7, 执行后y的值是8

--y,根据上面的结果,表达式的值是7,执行后,y的值是7

++y, 根据上面结果,表达式的值是8,执行后y的值是8;

这也就是你以为结果是8,7,7的过程对吧?或者你是从左到右,也能得到这个结果.但从左到右是错误的顺序;

再来看下为什么预想的结果跟运行结果不一样;

我不知道你是什么编译器,所以以我的vs2015来演示下:

上面是这句代码的反汇编,可以看到,编译器将这句代码按下面的顺序编译的;

1,先保存y值,这里我们将这个值叫做x,因为第一个要入栈的是y++; y++结果就是y的值, 后面会将保存的这个值,用于第一个入栈,所以才先保存这个值;

2,y=y+1, y值为8

3,y=y-1,y值为7

4,y=y+1,y值为8

5开始调用printf(y, y, x);

那么他的输出就是8,8,7;

也就是说, 编译器提前先把表达式的值都计算出来以后,再作为参数传入, 而不是,一边传参一边计算;

虽然这个结果跟你的运行结果不一样, 但也不能说哪个对哪个错;只能是编译器执行的计算顺序不一样

不同的编译器对这句代码有不一样的编译方式;

希望对你有一点帮助

%d\,这里y++的加一操作被放到了printf函数调用后, y++ 操作在这里才计算,而++y。 纠结这个问题没意义,--y是立即生效的,还得看编译器怎么实现的。 你再加一句printf("n", y); 应该输出的是8 这个不同的编译器有不同的结果 应该是从右向左计算的
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
海友酒店地址有知道的么?有点事想过去
求潜行吧 奈亚子第二季百度云
哪位大神有小说《似水流年》?
环卫局是干什么的?
查找南少林武术学校的资料?
写一条告示 最简明得体的
北京现代是国产还是合资的!
Ulead VideoStudio 11打不开视频怎么回事
高中生物: 能量是单向流动的,那么最终流到哪
用英语翻译在我们班百分之二十的学生是女生
长沙南站到娄底的汽车 发车的时间 是不是只有
青岛公交368路与3路在哪站是同站点(往李村方
张家口有三一重工吗?
碎石的小说(你死我活)
摆放在花园里的花有什么用
推荐资讯
历史上俾斯麦和提尔皮茨相遇过吗?
祖慈肩颈海沧店我想知道这个在什么地方
芙蓉名媛美甲地址在什么地方,想过去办事
车座子拆了一个,被扣车,属于车辆改型,罚款
美军说“收到”那个词/短语怎么拼
警察想知道她长什么样?求英语翻译
所有黄色人都是中国后代吗
沙发价格一般多少钱 如何选择合适的沙发
缘林宾馆我想知道这个在什么地方
朋友该分三六九等吗?
nodejs中的http是什么模块
伊博莱门窗系统(天通西苑一区店)地址有知道的
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?