C++ "AND"评估 - 标准保证?
C++ 'AND' evaluation - standard guaranteed?
可能重复:
短路评估的安全问题
标准对评估&&
表达式有何规定?它是否保证参数的评估将在第一个false
停止?
例如:
Foo* p;
//....
if ( p && p->f() )
{
//do something
}
如果p == NULL
,是否保证不会调用f()
?
此外,评估顺序是否保证是条款中的出现顺序?
优化器可能会更改以下内容:
int x;
Foo* p;
//...
if ( p->doSomethingReallyExpensive() && x == 3 )
{
//....
}
到它首先评估x==3
的表单?还是它总是先执行真正昂贵的函数?
我知道在大多数编译器(可能是所有编译器(上,在遇到第一个false
之后,评估就会停止,但标准对此有何规定?
标准对评估&;表达式-它是否保证参数的求值将在第一个false时停止?
是的。这就是所谓的短路。
此外,评估顺序是否保证是条款中的出现顺序?
是的。从左到右。表达式短路之前的操作数不会得到求值。
int a = 0;
int b = 10;
if ( a != 0 && (b=100)) {}
cout << b << endl; //prints 10, not 100
事实上,以上两点是我在这里的解决方案中的关键点:
- 不使用条件语句和三元运算符求C中三个数的最大值
在ANSI C标准3.3.13:中
Unlike the bitwise binary & operator, the && operator guarantees
left-to-right evaluation; there is a sequence point after the
evaluation of the first operand. If the first operand compares equal
to 0, the second operand is not evaluated.
在C++标准中有一个等价的语句
&&
(和||
(建立序列点。因此,左侧的表达式将在右侧之前进行求值。此外,是的,如果左侧为假/真(对于&&
/||
(,则不会评估右侧。
标准对评估&;表达式-它是否保证参数的求值将在第一个false时停止?
此外,评估顺序是否保证是条款中的出现顺序?
5.14/1.不同于&&保证从左到右求值:如果第一个操作数为false,则不求值第二个操作数。
这只适用于标准&;运算符,用户定义的operator &&
重载没有这个保证,它们的行为就像常规的函数调用语义。
优化器可能会更改以下内容:如果(p->doSomethingReallyExpensive((&;x==3(到它首先计算x==3的形式?
优化器可以决定首先评估x == 3
,因为如果x
没有被p->doSomethingReallyExpensive()
修改,它是一个没有副作用的表达式,或者甚至在p->doSomethingReallyExpensive()
已经返回false之后评估它。但是,可见行为保证是先前指定的:从左到右评估和短路。这意味着,虽然x == 3
可能首先被评估并返回false,但实现仍然必须评估p->doSomethingReallyExpensive()
。
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 位阵列上的快速AND运算
- 铸造标准::有没有回到原来的类型
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 如何解释C++标准文档中的"terms and definitions"?
- 标准::矢量::擦除与"swap and pop"
- C++ "AND"评估 - 标准保证?