看看这个简单的类:

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) 然后 Expr1Expr2 在打印 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_atmp_b 之前发送到输出。但它不保证 tmp_atmp_b 之前被评估。

关于c++ - 运算符的优先级?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28079725/

10-11 23:15
查看更多