a && (b = 5/a)
是否将5/a
分配给b
(对于非零a
)?
我的朋友说没有,但我很困惑,为什么不这样做。
答案 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 ...
检查出来