【发布时间】:2011-11-03 09:14:01
【问题描述】:
5.15 标准中的逻辑或运算符表示如下:
不像 |, ||保证从左到右的评估;
这是否意味着我无法在标准中找到某个地方,| 被定义为从右到左评估,或者它是实现定义的?当运算符重载时,这会有所不同吗?我编写了一个快速程序来测试这一点,MSVC++ 和 GCC 似乎都在评估 从右到左。
#include<iostream>
using namespace std;
int foo = 7;
class Bar {
public:
Bar& operator|(Bar& other) {
return *this;
}
Bar& operator++() {
foo += 2;
return *this;
}
Bar& operator--() {
foo *= 2;
return *this;
}
};
int main(int argc, char** argv) {
Bar a;
Bar b;
Bar c = ++a | --b;
cout << foo;
}
这会输出16。
如果++a 和--b 切换,则输出19。
我还考虑过我可能会遇到序列点规则之间的多次更改(以及因此未定义的行为),但我不确定这如何/是否适用于两个单独的实例作为操作数。
【问题讨论】:
-
请注意,尽管
a和b是不同的实例,但它们都引用相同的foo,因此您确实在调用未定义的行为,因为您多次写入同一个变量而没有一个中间序列点。 -
调用每个算子都是一个序列点,这样就可以了。
标签: c++ operators undefined standards-compliance operator-precedence