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 运算符。
(强调我的)
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
.
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 的更多信息。
我一直不敢这样写:
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 运算符。
(强调我的)
The && operator groups left-to-right. The operands are both contextually converted to bool. The result is
true
if both operands aretrue
andfalse
otherwise. Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand isfalse
.
The || operator groups left-to-right. The operands are both contextually converted to bool. The result is
true
if either of its operands istrue
, andfalse
otherwise. Unlike |, || guarantees left-to-right evaluation; moreover, the second operand is not evaluated if the first operand evaluates totrue
.
&&
和 ||
的计算顺序是从左到右。
在这种情况下表示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 的更多信息。