orl*_*rlp 27 c++ operator-precedence logical-operators
是否&& ||保证逻辑运算符()的从左到右的评估?
假设我有这个:
SDL_Event event;
if (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这保证与此相同吗?
SDL_Event event;
if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这也很重要,假设我们有两个要求,a并且b.因此,要求a更有可能失败b.然后说它if (a && b)比说更有效率if (b && a).
Mat*_*lia 43
是的,它是有保证的,否则这样的运营商会失去很多用处.
重要提示:这仅适用于内置&&和||; 如果某些犯罪分子重载它们,则将它们视为"常规"重载二元运算符,因此在这种情况下,两个操作数总是被评估,并且像往常一样以未指定的顺序.出于这个原因,永远不要超载它们 - 它打破了关于程序控制流程的一个非常重要的假设.
&&并||保证短路行为§5.141
不像
&,&&保证左到右的评价:如果第一个操作数是不计算第二个操作数false.
§5.151
不同于
|,||保证从左到右的评估; 此外,如果第一个操作数的计算结果为,则不计算第二个操作数true.
§13.59
子条款13.5.3至13.5.7中未明确提及的运算符作为遵守13.5.1或13.5.2规则的普通一元和二元运算符.
并&&与||未在这些小节中明确地提到,所以定期§13.5.2成立:
§13.5.21
二元运算符应由具有一个参数的非静态成员函数(9.3)或具有两个参数的非成员函数实现.因此,对于任何二元运算符
@,x@y可以解释为x.operator@(y)或者operator@(x,y).
没有特别规定只评估一方或特定顺序.
(来自C++ 11标准的所有引文)