为什么布尔表达式中元素的顺序会改变结果? [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么布尔表达式中元素的顺序会改变结果? [重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
如果x为0,则打印0。如果y为0,则会出错。
为什么是这样?我唯一能想到的是布尔表达式编译的顺序很重要。如果x为0,则得到(false)&&(错误值),其中false在左侧,如果y为0,则得到(错误值)&&(false)。为什么会影响打印的内容?
int main(void) {
int x = 1;
int y = 0;
int a = (x/y > 0)&&(y/x > 0);
printf("%d
", a);
return 0;
}
答案
与C中的大多数其他运算符相比,运算符&&
以“短路”方式定义了从左到右的评估顺序。即,如果第一个条件失败,第二个条件甚至不会被评估,因此它将没有机会失败。请注意,此“短路”评估不仅仅是(可选)优化问题;这是由语言保证的。因此,以下表达式永远不会导致错误:
int x = 1, y = 0;
int result = (y/x) && (x/y); // OK; y/x yields 0 (meaning false), such that the second operand will not be evaluated.
BTW:运营商||
也保证了这种短路行为。
另一答案
x / y
的行为未定义为y
是0
。
编译器知道y
是0
并且显然正在优化表达式。它也知道(y/x > 0)
是0
,并且由于&&
,整个表达的结果是0
。
较不激进的优化编译器会在运行时将零除错误提升。建议你检查程序集,看看编译器做了什么。
最终得分:编译器1,程序员0。
以上是关于为什么布尔表达式中元素的顺序会改变结果? [重复]的主要内容,如果未能解决你的问题,请参考以下文章