运算符的优先级?
Precedence of operators?
看看这个简单的class:
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
的输出之前被评估?
这一行:
cout << a.get() << b.get();
未指定先计算 a.get()
还是 b.get()
。
由于 a
和 b
共享相同的 val
指针,这些操作的顺序会影响输出。
(编辑)
Does it means that when I have cout << (Expr1) << (Expr2) then Expr1 and Expr2 are evaluated before the output of Expr1 is printed?
那个也没有说明。
运算符优先级不决定中间结果的评估顺序。 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
.
之前被 评估
看看这个简单的class:
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
的输出之前被评估?
这一行:
cout << a.get() << b.get();
未指定先计算 a.get()
还是 b.get()
。
由于 a
和 b
共享相同的 val
指针,这些操作的顺序会影响输出。
(编辑)
Does it means that when I have cout << (Expr1) << (Expr2) then Expr1 and Expr2 are evaluated before the output of Expr1 is printed?
那个也没有说明。
运算符优先级不决定中间结果的评估顺序。 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
.