我总是不敢这样编码:
void func( some_struct* ptr ) {
if ( ptr != nullptr && ptr->errorno == 0 )
do something...
};
相反,我总是这样做:
void func( some_struct* ptr ) {
if ( ptr != nullptr )
if ( ptr->errorno == 0 )
do something...
};
因为我担心逻辑运算符&;在C++标准中没有指定,尽管现在几乎所有的编译器通常都能得到正确的结果。在一本书中,有两条规则让我想确切地了解它
我的问题是:在不重载的情况下,逻辑运算符"&&"one_answers"||"的求值顺序是确定的吗?
对不起,我的英语不好,我是中国人。如果有重复的话题,我很抱歉,因为我找不到正确的关键词来搜索。无论如何,谢谢!
是的,标准保证内置逻辑AND运算符和逻辑OR运算符。
(重点矿井(
[expr.log.和]/1
&操作员组从左到右。操作数都在上下文中转换为布尔。如果两个操作数都是
true
,则结果为true
,否则为false
。与&不同&;保证从左到右求值:如果第一个操作数是false
,则不求值第二个操作数。
[expr.log.或]/1
||运算符从左到右分组。操作数都在上下文中转换为布尔。如果其任一操作数为
true
,则结果为true
,否则为false
。与|不同,||保证从左到右的评估;此外,如果第一个操作数的计算结果为true
,则不计算第二个操作数。
&&
和||
的评估顺序从左到右。
意味着在这种情况下if (condition-1 && condition-2)
,那么编译器将首先检查条件-1。如果条件-1为真,那么它将检查下一个条件。但如果条件-1为false。它将返回false,因为在&&
中,一个false条件表示结果为false
类似于if (condition-1 || condition-2)
的情况,编译器将首先检查条件-1。如果它是真的,那么它将返回真。因为若||
,若其中一个条件为真,那个么结果为真。无需检查下一个条件。但如果它是假的,它将检查下一个条件。。。
这些运算符有固定的评估规则,您可以依赖这些规则。
你可以安全地使用这样的代码:
if (op1 && op2)
对于&&
,两个操作数都需要生成true
才能成为true
,如果其中一个操作数是false
,则它短路,这意味着对&&
的进一步评估停止,并返回false
。简而言之,如果第一个操作数是false
,则第二个操作数将不会求值,因为运算符将立即返回false
。
对于||
的情况,如果至少其一个操作数为真,则它将短路。因此,如果第一个操作数是true
,则不会计算第二个操作数,因为运算符会自动返回true
。
这意味着类似这样的代码:if (op1 && op2)
等效于:
if (op1)
{
if (op2)
{
//some code
}
}
像这样的代码if (op1 || op2)
与相同
if (op1)
{
//some code
}
else if (op2)
{
//same code
}
检查这些以了解有关求值顺序、运算符优先级和逻辑运算符的更多信息。