我刚刚读到计算顺序和运算符的优先级在 C++ 中是不同但相关的概念。但我仍然不清楚它们有何不同但又相关?
int x = c + a * b; // 31
int y = (c + a) * b; // 36
以上陈述与评估顺序有什么关系。例如当我说 (c + a)
时,我是不是通过改变它的优先级来改变表达式的求值顺序?
最佳答案
关于评估顺序的重要部分是任何组件是否有副作用。
假设你有这个:
int i = c() + a() * b();
a
和 b
有副作用:
int global = 1;
int a() {
return global++;
}
int b() {
return ++global;
}
int c() {
return global * 2;
}
编译器可以选择调用a()
、b()
和c()
的顺序,然后将结果插入到表达。此时,优先级接管并决定应用 +
和 *
运算符的顺序。
在这个例子中,最有可能的结果是
- 编译器将首先评估
c()
,然后是a()
,然后是b()
,结果是i = 2 + 1 * 3 = 5
- 编译器会先计算
b()
,然后是a()
,然后是c()
,结果是i = 6 + 2 * 2 = 10
但编译器可以自由选择它想要的任何顺序。
简而言之,优先级 告诉您运算符应用于参数的顺序(*
在 +
之前),而 order of evaluation 告诉您参数解析的顺序(a()
、b()
、c()
).这就是为什么它们“不同但相关”。
关于c++ - 表达式的求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7618590/