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

问题描述 投票:-3回答:2

如果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\n", a);
  return 0;
}
c parsing compilation
2个回答
6
投票

与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:运营商||也保证了这种短路行为。


2
投票

x / y的行为未定义为y0

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.