【发布时间】:2018-03-02 07:39:19
【问题描述】:
如果 x 为 0,则打印 0。如果 y 为 0,我们会得到一个错误。
这是为什么?我唯一能想到的是布尔表达式的编译顺序很重要。如果 x 为 0,则我们得到 (false)&&(error value),其中 false 在左侧,如果 y 为 0,则我们得到 (error value)&&(false)。为什么这会影响打印的内容?
int main(void) {
int x = 1;
int y = 0;
int a = (x/y > 0)&&(y/x > 0);
printf("%d\n", a);
return 0;
}
【问题讨论】:
-
除以零应该触发 SIGFPE。
-
@liliscent:不使用整数除法。
-
如果 x 为零,则表达式为零并且 &&“短路”。如果 y 为 0,则除以零并调用未定义的行为。没有别的了。
-
@Bathsheba SIGFPE 也会因整数算术错误而引发。
-
@Bathsheba SIGFPE 比浮点运算更具包容性。甚至整数除法溢出也是SIGFPE。
标签: c parsing compilation