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

Has c++ standard specified the evaluation order of an operator&&(built-in)?

我一直不敢这样写:

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++ 标准中没有指定,尽管通常我们可以用现在几乎所有的编译器得到正确的结果。 在a book中,2条规则让我想了解它。

我的问题是: 不重载,是逻辑运算符“&&”和“||”的求值顺序确定?

抱歉我的英语不好,我是中国人。如果有重复的主题,我深表歉意,因为我无法找出正确的关键字来进行搜索。 无论如何谢谢!

是的,标准保证内置逻辑 AND 运算符和逻辑 OR 运算符。

(强调我的)

[expr.log.and]/1

The && operator groups left-to-right. The operands are both contextually converted to bool. The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.

[expr.log.or]/1

The || operator groups left-to-right. The operands are both contextually converted to bool. The result is true if either of its operands is true, and false otherwise. Unlike |, || guarantees left-to-right evaluation; moreover, the second operand is not evaluated if the first operand evaluates to true.

&&|| 的计算顺序是从左到右。

在这种情况下表示if (condition-1 && condition-2),然后编译器将首先检查条件1。如果条件 1 为真,那么它将去检查下一个条件。但如果条件 1 为假。它将 return 为假,因为 && 一个假条件意味着结果为假

同理if (condition-1 || condition-2),编译器会先检查condition-1。如果为真,那么它将 return 为真。因为如果||,如果一个条件为真,那么结果为真。无需检查下一个条件。但如果为假,它将检查下一个条件...

这些运算符有固定的评估规则,您可以依赖。

您可以安全地使用这样的代码:

if (op1 && op2)

对于 &&,两个操作数都需要得到 true 才能成为 true,如果其中一个是 false 那么它 短路 ,这意味着 && 的进一步评估停止并且 returns false。简而言之,如果第一个操作数是 false,则不会计算第二个操作数,因为运算符将立即 return false

对于 || 的情况,如果 至少 它的操作数之一为真,它将短路。因此,如果第一个操作数是 true 那么它不会评估第二个操作数,因为运算符 returns true 自动。

这意味着这样的代码:if (op1 && op2) 等同于:

if (op1)
{
    if (op2)
    {
        //some code
    }
}

像这样的代码 if (op1 || op2) 等同于:

if (op1)
{
    //some code
}
else if (op2)
{
    //same code
}

检查这些以了解有关 order of evaluation, operator precedence and logical operators 的更多信息。