我总是想知道某件事,而在其他地方找不到答案。如果我有这段代码:
if ((cond1) &&(cond2) && (cond 3) && (cond 4))
{
// do something
}
假设第一个条件是假的,那么我的程序也会验证其他条件,或者只是跳过验证它们?
但如果我有
if ((cond1) ||(cond2) || (cond 3) || (cond 4))
{
// do something
}
和cond 1是真的,我的程序会立即转到if部分还是继续验证其他条件?
答案 0 :(得分:4)
引用C11
标准,章节§6.5.13,逻辑AND运算符(强调我的)
与按位二进制
&
运算符不同,&&
运算符保证从左到右的评估; 如果计算第二个操作数,则在评估之间存在一个序列点 第一和第二个操作数。 如果第一个操作数比较等于0,则第二个操作数 操作数未被评估。
因此,如果第一个条件(LHS操作数)的计算结果为 false ,则后面的条件,即&&
的RHS操作数不进行评估。
类似地(讽刺地,而不是),对于逻辑“OR”运算符,
与按位
|
运算符不同,||
运算符保证从左到右的评估;如果 评估第二个操作数,在第一个操作数的评估之间有一个序列点 和第二个操作数。 如果第一个操作数比较不等于0,则第二个操作数为 未评估。
答案 1 :(得分:2)
在C&&&和|| “sort-circuit”,意思是如果左操作数的评估足以确定结果,则不评估右操作数。