Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 评估的顺序是什么?为什么?C++;_C++_Function_Arguments_Expression Evaluation - Fatal编程技术网

C++ 评估的顺序是什么?为什么?C++;

C++ 评估的顺序是什么?为什么?C++;,c++,function,arguments,expression-evaluation,C++,Function,Arguments,Expression Evaluation,首先计算哪个foo函数调用,为什么? 我发布的代码经过简化,因此无需跟踪。 谢谢假设**是打字错误而不是语法错误,并使用以下命名: 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)));** retur

首先计算哪个foo函数调用,为什么? 我发布的代码经过简化,因此无需跟踪。
谢谢

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

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;
}
以下是事实:

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

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

5.2.2/4:调用函数时,每个参数都应使用相应的参数初始化。[注:如 初始化的顺序是不确定的 其他-附注]


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

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;
}
以下是事实:

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

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

5.2.2/4:调用函数时,每个参数都应使用相应的参数初始化。[注:如 初始化的顺序是不确定的 其他-附注]


我想用**指出代码的一部分,谢谢你,我想我现在明白了它是UB,因为
b
被修改了。事实上,同一个变量有4个未排序的副作用,即UB。但在能够做出这一陈述之前,首先必须确定它们没有排序(即没有定义顺序),这正是这个问题的目的。@Christophe但如果回答中没有提到UB,OP可能会认为这样的表达是合理的。@RichardCriten这个问题看起来更像是一个家庭作业问题,旨在检查学生是否回忆起未经提问的评估,而不是一个现实生活中的问题,如果可能存在将其放入真实代码的风险,那么我只想回答这个问题。我想用**指出代码的一部分,谢谢你,我想我现在理解了它是UB,因为
b
被修改了。事实上,在同一个变量上有4个未排序的副作用,即UB。但在能够做出这一陈述之前,首先必须确定它们没有排序(即没有定义顺序),这正是这个问题的目的。@Christophe但如果回答中没有提到UB,OP可能会认为这样的表达是合理的。@RichardCriten这个问题看起来更像是一个家庭作业问题,旨在检查学生是否回忆起未经提问的评估,而不是一个现实生活中的问题,在可能存在将其放入实际代码的风险的情况下,我限制自己回答这个问题。UB,参数
b
被修改了不止一次。UB,参数
b
被修改了不止一次。