在我的计算机上运行以下程序:
我得到了这个输出:
据我所知,前缀
谢谢!
#include <iostream>
class Int {
public:
Int(int x) : val{x} {}
Int operator++() {
std::cout << "Int::operator++()\n";
return ++val;
}
friend Int operator+(Int a, Int b) {
std::cout << "operator+(Int, Int)\n";
return a.val + b.val;
}
friend Int operator*(Int a, Int b) {
std::cout << "operator*(Int, Int)\n";
return a.val * b.val;
}
private:
int val;
};
int main()
{
Int a = 1, b = 2;
b = ++a + b * b;
return 0;
}
我得到了这个输出:
operator*(Int, Int)
Int::operator++()
operator+(Int, Int)
据我所知,前缀
++
的优先级高于二进制*
。但是在上面显示的输出中,前缀++
在二进制*
之后被调用了!这是因为编译器将运算符+视为函数调用(导致未指定行为)吗?我是否可以始终将重载运算符视为函数(这使得当x
是Int
时x = x++
的行为被定义良好)?谢谢!
++
比乘法运算符*
具有更高的优先级,因此表达式++a + b * b
等同于(++a) + (b * b)
。但是,对于+
的操作数的评估顺序是未指定的,因此不能保证b*b
将在++a
之前或之后被评估。 - Peter