永发信息网

#include<stdio.h> void main() { int i=8; printf("%d\n%d\n",++i,--i); } 结果为什么是8 7 而不是

答案:2  悬赏:70  手机版
解决时间 2021-02-07 21:35
  • 提问者网友:雨不眠的下
  • 2021-02-07 04:18
#include<stdio.h> void main() { int i=8; printf("%d\n%d\n",++i,--i); } 结果为什么是8 7 而不是9 7
最佳答案
  • 五星知识达人网友:爱难随人意
  • 2021-02-07 05:24
printf里的运算是从右到左,先--i,值为7,然后再++i,值为8.
全部回答
  • 1楼网友:不想翻身的咸鱼
  • 2021-02-07 06:53

这个在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;

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

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

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

希望对你有一点帮助

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯