c++标准是否指定了运算符&&(内置)的求值顺序?



我总是不敢这样编码:

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
}

检查这些以了解有关求值顺序、运算符优先级和逻辑运算符的更多信息。

相关内容

  • 没有找到相关文章

最新更新