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

问题描述 投票:0回答:1

我总是不敢这样编码:

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条规则让我想确切了解一下。

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

抱歉,我的英文很丑,我是中国人。对于是否有重复的主题,我深表歉意,因为我无法指出要搜索的正确关键字。还是谢谢!

c++ logical-operators operator-precedence expression-evaluation
1个回答
1
投票

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

[expr.log.and]/1

&&运算符从左到右分组。操作数都在上下文中转换为bool。如果两个操作数均为true,则结果为true,否则为false。与&不同,&&保证从左到右求值:如果第一个操作数为false,则不对第二个操作数求值。

[expr.log.or]/1

||操作员组从左到右。操作数都在上下文中转换为bool。如果其两个操作数中的任何一个为true,则结果为true,否则为false。与|,||不同保证从左到右的评估;此外,如果第一个操作数的值为true,则不评估第二个操作数。

© www.soinside.com 2019 - 2024. All rights reserved.