为什么布尔表达式中元素的顺序会改变结果? [重复]

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的行为未定义为y0

编译器知道y0并且显然正在优化表达式。它也知道(y/x > 0)0,并且由于&&,整个表达的结果是0

较不激进的优化编译器会在运行时将零除错误提升。建议你检查程序集,看看编译器做了什么。

最终得分:编译器1,程序员0。

以上是关于为什么布尔表达式中元素的顺序会改变结果? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

php 流程控制

具有 10 个元素的随机布尔数组,其中 10 个元素中有 3 个为真 [重复]

如果列表在其他列表中的布尔表达式

带有if条件的隐式布尔评估[重复]

从列表中删除布尔值[重复]

为什么布尔表达式的值不会改变? (JAVA)