int x = 1, y = 0;
x-->(y+x)?5:25>y++?'1':'2';
表达式先运算后面的条件运算符即 25 > y++? '1':'2',得到结果为'1',而y的值应该变成了1,为何测验后整个表达式运行完后,y的值为0?而且把x--改成x,y的值居然又变成1
因为x-->(y+x)所以第一个判断表达式的值就是5了 后面不执行y++
x-- 左边是1 右边是0+0(x--先使用再自减)
1大于0成立 输出1
去掉-- 左边是1 右边是0+1
不成立
所以y++执行
y最后是1
#include <stdio.h>
#include <string.h>
int main()
{
int x = 1, y = 0;
printf("%d",x-->(y+x)?5:25>y++?'1':'2');
return 0;
}
在计算表达式x-->(y+x)?5:25>y++?'1':'2';
过程中,计算x-- > (y+x)
是有问题的,在不同编译器会得到不同结果(比如MSVC和gcc/clang得到的结果就不一样)。这是因为C/C++语言里没有规定运算符操作数的计算顺序,编译器可以按任意顺序来计算操作数。所以对于运算符>的两个操作数x--和(y+x)的计算顺序在不同编译器上是不一样的。
比如gcc/clang编译器是先算x--,后算y+x,这样得到判断是1 > 0,三目运算结果是5,后面的三目运算不会被计算,y++没有被执行,y的值为0
而msvc编译器是先算y+x后算x--,这样得到判断是1 > 1,因此三目运算的结果是接着计算后面的三目运算,从而y++被执行,y的值为1
当你把x--换成x,计算x > (y+x)是不会有问题的,因为无论哪个操作数先计算,其结果都是一样的,判断都是1 > 1,因此接着计算第二个三目运算,从而y++被执行,y的值变为1
https://en.cppreference.com/w/c/language/eval_order
应该是编译器的问题
自加和自减相关的问题是初学者最容易陷入的第一个有疑惑的地方,首先由于各种编译器对于自加自减的具体底层实现不同,导致可能会出现两种截然不同的情况,其次自加自减只是一个语法特性,最好不要把它应用复杂的表达式当中,只会增加阅读代码的成本,最后工作开发时,一般自加自减的用途都保持其最初的原始用法,对于复杂的编程通常不会进行混用,工作时更要考虑维护和简单易懂,如果你目前只是学习阶段,不要在这方面花太多的时间和精力,多多学习和了解更多的知识是最优解
x-->(y+x)?5:25>y++?'1':'2';
1.首先执行x--,此时x的值还是为1.
2.y+x的值为1
3.所以此时三目运算符 x-- > (y+x)?5:25 的值为 25 (因为1不大于1)
4.还有一个三目运算符(x-->(y+x)?5:25) 25>y++?'1':'2',很显然 25>0
5.最后执行 x的值减一,所以 x为0 y的值加1 y=1;
这就是一个简单的自加和自减 如果你将x--改为--x,则结果又不一样了
两个条件运算符在一起,不是得先算右边的吗?所以为什么不是25>y++?'1':'2'先执行呢?
(1)x=1 自减后0 1>0+0 输出5,输出的是5,y++没有被执行,y=0
(2)换成x后,1>0+1不成立,执行第3个表达式(25>y++?'1':'2'),此时y=1,输出的也是1,因为25>0
别去纠结这个了,不同的编译器结果不一样,这个东西本来就是乱的,算是C语言的一个BUG
这种操作符实际使用不到,不用纠结
测试图:
代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
int x = 1, y = 0;
x-->(y+x)?5:25>y++?'1':'2';
printf("%d\n",y);
return 0;
}
经过代码可以发现答案是为0的,
但是自己去按照运算级去推理,会有1等不同的结果。
不妨换个角度想想,把这句代码注释掉,y是否仍然为0?
测试结果如图:
#include <stdio.h>
#include <string.h>
int main()
{
int x = 1, y = 0;
//x-->(y+x)?5:25>y++?'1':'2';
printf("%d\n",y);
return 0;
}
所以这题你把它当做一个bug也好,当做一个矛盾也好,当做一个错误也罢,它意义个人感觉并不会很大,经过一圈这样那样的运算,最后结果还是0。与其纠结这个,个人觉得不如好好学一下其它内容,当然,感兴趣的话,可以借助运算级优先表自己推理一下试试。
以上仅供参考,希望对题主有所帮助,可以的话,帮忙点个采纳!
三个字,有BUG
大哥怎么想出来的这种题