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

在C中,如果第一个逻辑部分失败,是否执行if结构的第二部分?行为是否依赖于编译器?,c,if-statement,compiler-construction,C,If Statement,Compiler Construction,扩大问题范围 用于C编程 if((NULL!=b)&&(query(&b))) 在上述代码中,如果b=Null,是否会执行“查询(&b)”部分? 编译器之间的行为是否一致 否,C中的逻辑运算符将短路 如果在a为false时尝试计算a和

扩大问题范围

用于C编程

if((NULL!=b)&&(query(&b)))
在上述代码中,如果b=Null,是否会执行“查询(&b)”部分?
编译器之间的行为是否一致

否,C中的逻辑运算符将短路

如果在
a
为false时尝试计算
a和
,则不会计算
b

但请记住,您并不是在用原始语句检查
b
,而是在检查
a
。还要注意的是,取一个空变量的地址是安全的,只是不能取消引用它

我想你应该写的是:

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

否,C中的逻辑运算符将短路

如果在
a
为false时尝试计算
a和
,则不会计算
b

但请记住,您并不是在用原始语句检查
b
,而是在检查
a
。还要注意的是,取一个空变量的地址是安全的,只是不能取消引用它

我想你应该写的是:

if ((b != NULL) && (query (*b)) ...
在上述代码中,如果b=Null,是否会执行“查询(&b)”部分

简单回答否。它将不会被执行<代码>&
为。因此,如果您尝试这样做,这将中断短路评估,因此不建议这样做

检查

在上述代码中,如果b=Null,是否会执行“查询(&b)”部分

简单回答否。它将不会被执行<代码>&
为。因此,如果您尝试这样做,这将中断短路评估,因此不建议这样做


选中

以添加已发布的正确答案这是C99标准所述(第6.5.13节逻辑与运算符,第4段):

与按位二进制&运算符不同,&&运算符保证 从左到右评价;有一个序列点在 第一个操作数的求值。如果第一个操作数比较相等 如果设置为0,则不计算第二个操作数


为了补充已发布的正确答案,C99标准规定了以下内容(第6.5.13节逻辑与运算符,第4段):

与按位二进制&运算符不同,&&运算符保证 从左到右评价;有一个序列点在 第一个操作数的求值。如果第一个操作数比较相等 如果设置为0,则不计算第二个操作数


它不是特定于
if
语句,而是一般的布尔表达式

a和&b
中,如果
a
为false,则不计算
b

类似地,在
c | | d
中,如果
c
为真,则不计算
d


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

它不特定于
if
语句,而是一般的布尔表达式

a和&b
中,如果
a
为false,则不计算
b

类似地,在
c | | d
中,如果
c
为真,则不计算
d


这就是所谓的短路评估,它是语言定义的一部分,因此在兼容的编译器中是一致的。

看看这个:。一句话:运算符将短路,这是标准的C行为。此问题中使用的语言不准确且含糊不清。我会假设if构造或语句(不是结构)的“第二部分”是
else
部分。在这里,您只是在谈论布尔运算的左侧-
if
构造是不相关的。感谢您接受我的回答,但这应该归功于其他人(比如最先发帖的paxdiablo),因为我只是想添加一个参考以清晰明了,而其他人在回答中投入了更多的时间。@jpw,这应该归功于最好的答案,而不是第一个。不幸的是,我在去看标准文件之前就被叫走了。对于这样的语言问题,最好的答案几乎总是引用标准,所以你的答案是当之无愧的。在任何情况下,我都不需要rep:-)@paxdiablo+1给你:)看看这个:。一句话:运算符将短路,这是标准的C行为。此问题中使用的语言不准确且含糊不清。我会假设if构造或语句(不是结构)的“第二部分”是
else
部分。在这里,您只是在谈论布尔运算的左侧-
if
构造是不相关的。感谢您接受我的回答,但这应该归功于其他人(比如最先发帖的paxdiablo),因为我只是想添加一个参考以清晰明了,而其他人在回答中投入了更多的时间。@jpw,这应该归功于最好的答案,而不是第一个。不幸的是,我在去看标准文件之前就被叫走了。对于这样的语言问题,最好的答案几乎总是引用标准,所以你的答案是当之无愧的。在任何情况下,我都不需要rep:-)@paxdiablo+1给你:)我认为在a&&b中,如果a为真,b不被评估。你的意思是说“如果a为假”我认为在a&&b中,如果a为真,b不被评估。你的意思是说“如果a为假”