扩展问题 What happens if the first part of an if-structure is false?
用于C编程
if((NULL!=b)&&(query(&b)))
在上面的代码中,如果b = Null,则会执行“query(& b)”部分吗? 编译器的行为是否一致?
答案 0 :(得分:4)
不,C中的逻辑运算符会短路。
如果您在a && b
为false时尝试评估a
,则不会评估b
。
但请注意,您没有使用原始语句检查b
,而是检查a
。另请注意,获取NULL变量的地址是安全的,您无法取消引用它。
我怀疑你应该写的是:
if ((b != NULL) && (query (*b)) ...
答案 1 :(得分:2)
要添加已经发布的正确答案,这是C99标准所说的内容(第6.5.13节逻辑AND运算符,第4段):
与按位二进制&操作员,&&运营商保证 从左到右的评价;之后有一个序列点 评估第一个操作数。如果第一个操作数比较相等 为0,不评估第二个操作数。
答案 2 :(得分:1)
在上面的代码中,如果b = Null,则会执行“query(& b)”部分吗?
简单回答NO。它不会被执行。 &&
是short circuited。因此,如果您尝试这样做,这将打破短路评估,因此不会被推荐。
检查FAQ3.6
答案 3 :(得分:1)
它不是特定于if
语句,而是特定于布尔表达式。
在a && b
中,如果b
为false,则不评估a
。
同样在c || d
中,如果d
为真,则不评估c
。
这称为短路评估,是语言定义的一部分,因此在兼容编译器中将保持一致。