#include<stdio.h> void main() { int y=7; printf("%d%d%d",++y,--y,y++); } 为什么第一个是7?
答案:3 悬赏:0
解决时间 2021-02-13 19:02
- 提问者网友:虛偽丶靜
- 2021-02-13 10:09
#include<stdio.h> void main() { int y=7; printf("%d%d%d",++y,--y,y++); } 为什么第一个是7?
最佳答案
- 二级知识专家网友:一身浪痞味
- 2021-02-13 10:40
这是二元运算符的问题,运算顺序从运算符右边到左边
所以会先算--y得到第二个数为6
再算第一个数++y得到7
最后算y++得到7
下面的运算符都是从右到左
有问题请追问
!
~
++
--
-
+
*
&
所以会先算--y得到第二个数为6
再算第一个数++y得到7
最后算y++得到7
下面的运算符都是从右到左
有问题请追问
!
~
++
--
-
+
*
&
全部回答
- 1楼网友:飘零作归宿
- 2021-02-13 12:24
这个在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;
也就是说, 编译器提前先把表达式的值都计算出来以后,再作为参数传入, 而不是,一边传参一边计算;
虽然这个结果跟你的运行结果不一样, 但也不能说哪个对哪个错;只能是编译器执行的计算顺序不一样
不同的编译器对这句代码有不一样的编译方式;
希望对你有一点帮助
- 2楼网友:不羁的心
- 2021-02-13 11:13
%d\,这里y++的加一操作被放到了printf函数调用后, y++ 操作在这里才计算,而++y。
纠结这个问题没意义,--y是立即生效的,还得看编译器怎么实现的。
你再加一句printf("n", y); 应该输出的是8 这个不同的编译器有不同的结果
应该是从右向左计算的
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯