在C中,如果第一个逻辑部分失败,是否执行if结构的第二部分?行为编译器是否依赖?

时间:2014-03-10 10:52:33

标签: c if-statement compiler-construction

扩展问题 What happens if the first part of an if-structure is false?

用于C编程

if((NULL!=b)&&(query(&b)))

在上面的代码中,如果b = Null,则会执行“query(& b)”部分吗? 编译器的行为是否一致?

4 个答案:

答案 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

这称为短路评估,是语言定义的一部分,因此在兼容编译器中将保持一致。