运算符的优先级
Precedence of operators?
看看这个简单的类:
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
的输出之前会评估Expr1
和Expr2
?
运算符优先级并不指示中间结果的计算顺序。 也就是说,它不规定整个表达式中子表达式的计算顺序。
表达式语句
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_b
之前评估tmp_a
。
这一行:
cout << a.get() << b.get();
不指定是先评估a.get()
还是先评估b.get()
。
由于 a
和 b
共享相同的val
指针,因此这些操作的顺序会影响输出。
(编辑)
这是否意味着当我有 cout <<(Expr1) <<(Expr2) 时,在打印 Expr1的输出之前评估 Expr1 和 Expr2?
也没有具体说明。
相关文章:
- C++ 带有函数指针的运算符优先级
- <<运算符优先级与字符串比较
- 在一个指令中声明更多指针的运算符优先级
- C++逗号运算符的优先级
- 为什么括号在这种情况下无法更改c++运算符的优先级
- C++中的运算符优先级
- c++中的增量和三元运算符优先级
- 涉及模运算符优先级的错误以及C++中具有大数字的括号
- 带有 cout 和指针的运算符优先级
- C++ 使用矢量迭代器时的运算符优先级
- 好友与成员运算符重载的优先级
- 序列点和运算符优先级有什么区别
- 运算符优先级 括号问题
- C++表达式中的运算符优先级
- 相等运算符优先级不起作用
- 类构造函数比"="运算符具有更高的优先级?
- 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级
- 如何使用将 const int 的运算符用作 int* 优先级队列的比较器
- 递增和按位移位运算符优先级?
- C++,计算具有多个"&&"且没有较低优先级运算符的表达式