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++标准中没有指定,尽管现在几乎所有的编译器通常都能得到正确的结果。在一本书中,有两条规则让我想确切地了解它
我的问题是:在不重载的情况下,逻辑运算符"&&"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
}
检查这些以了解有关求值顺序、运算符优先级和逻辑运算符的更多信息。
- 内置函数可查看CPP中的成员变量
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何从 c++ 中类中内置的数组继承
- 如何捕获 C++ 内置异常对象
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- 将编译器开关添加到 Eclipse CDT 内置编译器设置生成?
- gcc Atomic在gcc 4.1.1中内置了奇怪的行为
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 何时包含内置类型和运算符的标头?
- 基本类型与内置类型有什么区别C++
- 指内置类型的文字
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- c++标准是否指定了运算符&&(内置)的求值顺序?
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 为什么指针类型的内置关系运算符不生成C++的总顺序?
- 内置对象/库的静态初始化顺序失败
- C++中是否有一个std::string的内置函数,当两个字符串都可以是大写或小写时,可以按字母顺序比较两个字符串
- 内置类型的Do对象具有特殊的静态初始化顺序优先级