C++标准是否规定函数副作用先于求值?代码行为是否未定义?
问题解答
关于C++标准中函数副作用的排序规则
C++标准明确规定:函数调用过程中产生的所有副作用,都会在该函数的返回值被用于表达式后续计算之前完成排序。也就是说,函数体内部的操作(包括对变量的修改等副作用),一定会在函数返回值被读取、使用前全部执行完毕。
对示例代码的分析
先看给出的代码:
int x; int f() { return x++; } void g() { x = f(); }
当调用g()时,执行x = f()的过程是:
- 先调用
f(),f()里的x++会先返回当前x的值,然后对x执行自增(这是副作用); - 等
f()的所有操作(包括自增的副作用)完成后,再把f()的返回值赋值给x。
相当于执行了“读取x的值 → x自增1 → 把之前读取的x值重新赋值给x”,所以最终x的值保持不变,这个行为是定义良好的,不属于未定义行为。你在不同平台和编译参数下得到一致结果,正是因为这是标准规定的确定行为。
内容的提问来源于stack exchange,提问作者nalemy
相关产品推荐
相关产品推荐

