可能重复:
Is short-circuiting boolean operators mandated in C/C++? And evaluation order?
考虑以下代码:
char* str=NULL;
if(str!=NULL && str[0]=='h')
printf("ok");
验证的第一个条件是str不是NULL。我试图编译并运行此代码,我没有得到分段错误。
这意味着代码在if的下一个指令处中断,因为不需要进一步验证str [0]等于'h',因为它是和。
但问题是:这是否可以保证与所有编译器一起使用?不可能发生编译器生成汇编代码,由于某种原因,首先验证str是否等于'h'(导致分段错误),然后检查str是不是NULL?
答案 0 :(得分:3)
是的,这是有保证的。它被称为short-circuit evaluation。
根据C99标准(第6.5.13节):
与按位二进制
&
运算符不同,&&
运算符保证从左到右的评估; 在评估第一个操作数后有一个序列点。如果是第一个操作数 比较等于0,不评估第二个操作数。
类似的规则适用于||
;如果第一个操作数为true,则不评估第二个操作数。
答案 1 :(得分:0)
是。这就是它应该如何运作。