c++ - 表达式的求值顺序

标签 c++ evaluation operator-precedence

我刚刚读到计算顺序和运算符的优先级在 C++ 中是不同但相关的概念。但我仍然不清楚它们有何不同但又相关?

int x = c + a * b;    // 31
int y = (c + a) * b;  // 36

以上陈述与评估顺序有什么关系。例如当我说 (c + a) 时,我是不是通过改变它的优先级来改变表达式的求值顺序?

最佳答案

关于评估顺序的重要部分是任何组件是否有副作用。

假设你有这个:

int i = c() + a() * b();

ab 有副作用:

int global = 1;

int a() {
    return global++;
}
int b() {
    return ++global;
}
int c() {
    return global * 2;
}

编译器可以选择调用a()b()c()的顺序,然后将结果插入到表达。此时,优先级接管并决定应用 +* 运算符的顺序。

在这个例子中,最有可能的结果是

  1. 编译器将首先评估c(),然后是a(),然后是b(),结果是i = 2 + 1 * 3 = 5
  2. 编译器会先计算b(),然后是a(),然后是c(),结果是i = 6 + 2 * 2 = 10

但编译器可以自由选择它想要的任何顺序。

简而言之,优先级 告诉您运算符应用于参数的顺序(*+ 之前),而 order of evaluation 告诉您参数解析的顺序(a()b()c() ).这就是为什么它们“不同但相关”。

关于c++ - 表达式的求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7618590/

相关文章:

c++ - 为什么后缀运算符++的优先级高于前缀运算符++?

compiler-errors - Ocaml-匹配两个列表

c++ - Qt中的实时保存

lisp - 解析 Common Lisp 列表中的符号

c++ - 我们如何在不注册 dll 的情况下对我们的 c++ COM 代码进行单元测试?

testing - ROC 曲线/分类准确率,什么时候使用什么类型的评估指标?

c++ - 检查 Char/Int

python - 你能为 Python 中的重载运算符施加对象优先级吗?

c++ - 如何在旧 C++ 中初始化 const std vector ?

c++ - pthread mutex lock - 它是定期检查还是操作系统唤醒它