0

可能重复:
C/C++ 中是否强制要求短路布尔运算符?和评价顺序?

考虑这段代码:

char* str=NULL;
if(str!=NULL && str[0]=='h')
    printf("ok");

验证的第一个条件是 str 不为 NULL。我已尝试编译并运行此代码,但没有出现分段错误。
这意味着代码会在下一条指令中中断 if,因为不需要进一步验证 str[0] 是否等于“h”,因为它是一个与。
但问题是:这是否保证适用于所有编译器?不可能发生编译器出于某种原因生成的汇编代码,首先验证 str 是否等于“h”(导致分段错误),然后检查 str 是否为空?

4

2 回答 2

3

是的,这是有保证的。这称为短路评估

来自 C99 标准(第 6.5.13 节):

与按位二元&运算符不同,运算&&符保证从左到右的求值;在计算第一个操作数之后有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。

类似的规则适用于||; 如果第一个操作数为真,则不计算第二个操作数。

于 2012-05-01T15:39:47.747 回答
0

是的。这就是它应该如何工作的方式。

于 2012-05-01T15:39:44.447 回答