4

是否a && (b = 5/a)分配5/ab(对于非零a)?

我的朋友说它没有,但我很困惑为什么它不会。

4

4 回答 4

12

你朋友错了。对于非零a,该语句a && (b = 5/a)会将值分配5/ab

如果a == 0,则条件将短路并且不会发生分配。

于 2012-06-14T23:59:30.647 回答
4

你朋友错了。如果a评估为真,则必须评估双方,因为&&必须评估双方才能执行正确的操作。 ||另一方面不会。当然,您可以通过执行代码并检查b条件后的值来轻松地自己测试这一点。

于 2012-06-14T23:59:40.633 回答
1

在 C 语言中,如果从逻辑简化的角度来看,评估是有意义的,那么它会提前中断。

IE:

if(a && (b=5/a))

如果 a 为零,则逻辑上,整个语句为零/假,如果您忽略系统错误(即:除以零),则不会评估语句的其余部分(例如:“零且任何等于零” ,那么当我们已经知道最终答案总是为零时,为什么还要计算“和任何东西”部分)。

更好的解决方案是:

if(a) {
  b=5/a;
} else {
  b=0;
  printf("ERROR! Attempt to divide by zero would have happened here!");
if(a && b) {
  //Do stuff
}

祝你好运!

于 2012-06-15T00:04:37.957 回答
0

你朋友说的不对。假设 a 和 b 是整数,那么当 a 为零时 b 保持不变,但当 a 为零时,5 除以 a(int 除法!) ...

'&&' 运算符是短路评估...

使用 gcc 检查了这一点...

于 2012-06-15T00:05:49.957 回答