为什么“a&&(b = 5 / a)”不将“5 / a”分配给“b”?

时间:2012-06-14 23:58:18

标签: c debugging boolean variable-assignment unsigned

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

我的朋友说没有,但我很困惑,为什么不这样做。

4 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

在C中,如果从逻辑简化的角度来看,评估将会提前脱离。

即:

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
}
祝你好运!

答案 3 :(得分:0)

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

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

使用gcc ...

检查出来