看看这个简单的类:
class A {
int *val;
public:
A() { val = new int; *val = 0; }
int get() { return ++(*val); }
};
为什么当我运行此代码时,它会打印
21
:int main() {
A a, b = a;
cout << a.get() << b.get();
return 0;
}
但是,如果我像这样运行它,它会打印
12
这正是我所期望的:int main() {
A a, b = a;
cout << a.get();
cout << b.get();
return 0;
}
我在这里缺少什么?运算符优先级?仅供引用,这是一个 C++ 测试问题,而不是生产代码。
编辑:
这是否意味着当我有
cout << (Expr1) << (Expr2)
然后 Expr1
和 Expr2
在打印 Expr1
的输出之前被评估? 最佳答案
运算符优先级不规定中间结果的评估顺序。 IE。它不规定整个表达式中子表达式的求值顺序。
表达式语句
cout << a.get() << b.get();
可以被编译器执行为
int tmp_a = a.get();
int tmp_b = b.get();
cout << tmp_a;
cout << tmp_b;
或作为
int tmp_b = b.get();
int tmp_a = a.get();
cout << tmp_a;
cout << tmp_b;
在这种情况下,运算符
<<
的运算符优先级和结合性保证 tmp_a
在 tmp_b
之前发送到输出。但它不保证 tmp_a
在 tmp_b
之前被评估。关于c++ - 运算符的优先级?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28079725/