这是C/C++中的未定义行为

jay*_*aya 4 c c++ undefined-behavior

int foo(int c){
    return c;
}

int main(void){
    int a=5,c;
    c = foo(--a) + a; 
}
Run Code Online (Sandbox Code Playgroud)

它会在C/C++中调用未定义的行为吗?我想不,不会.

在阅读完所有答案之后,我无法弄清楚它是未定义的行为还是未指定的行为.

Eri*_*rik 16

是的,它是未定义的行为 - a并且foo(--a)可以按任何顺序进行评估.

有关进一步参考,请参阅例如序列点.在完整表达之后有一个序列点,并且在评估参数之后foo- 但子表达式的评估顺序未指定,每5/4:

除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改其存储值一次.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.

编辑:正如Prasoon指出的那样,由于评估的顺序,行为未指定......未指明.由于先前的值只能被访问以确定要存储的值,因此变为未定义


fil*_*mor 5

您应该阅读此内容,它将告诉您您的代码未定义,因为+它不是序列点,因此未定义是否f(--a)a首先进行评估.

  • 或者阅读Prasoon关于此事的优秀___ [FAQ条目](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)___. (3认同)