【问题标题】:What is the order to evaluate this and why? C++评估这个的顺序是什么,为什么? C++
【发布时间】:2023-03-03 17:37:01
【问题描述】:
int foo(int a, int& b, int c) {
    int temp = a;
    a = b;
    b = c;
    c = temp;
    return a - b;
}

int main() {


**foo(foo(a, b, c), b, foo(a, b, foo(a, b, c)));**


return 0;
}

首先评估哪个 foo 函数调用,为什么? 我发布的代码已简化,因此无需跟踪它。 谢谢

【问题讨论】:

  • UB,参数b被多次修改。

标签: c++ function arguments expression-evaluation


【解决方案1】:

假设** 是拼写错误而不是语法错误,并使用以下命名:

 (A)      (B)          (C)       (D) 
foo ( foo(a, b, c), b, foo(a, b, foo(a, b, c)))

以下是正确的:

  • (D) 在 (C) 之前评估,因为调用 (C) 需要参数值。
  • (A) 在 (B) 和 (C) 之后进行评估(因此 (D) )

不能说更多,因为 C++ 标准允许对编译器进行参数评估的排序:

5.2.2/4: 当一个函数被调用时,每个参数都应该用它对应的参数进行初始化。 [注:这样 初始化是不确定的顺序相对于每个 其他——尾注]

【讨论】:

  • 我的意思是用**指出代码部分,谢谢,我想我现在明白了
  • 它是UB,因为b被修改了。
  • 确实,在同一个变量上存在 4 个未排序的副作用,即 UB。但在能够做出这种陈述之前,首先必须确定它们没有排序(即没有定义的顺序),这正是这个问题的目标。
  • @Christophe 但如果答案中未提及 UB,则 OP 可能认为这样的表达是明智的。
  • @RichardCritten 这个问题看起来更像是一个家庭作业问题,旨在检查学生是否回忆起无意义的评估,而不是现实生活中的问题,在现实生活中可能存在将其放入实际代码的风险,所以我限制自己回答问题。
猜你喜欢
  • 2010-09-18
  • 2016-11-24
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
相关资源
最近更新 更多