You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++函数调用顺序是否明确?算术运算代码是否存未定义行为

C++表达式中函数调用顺序的问题

先看这段面试题里的代码:

int test_b = 1;
int test_x() {test_b++; return test_b;}
int test_y() {test_b = 3; return test_b - 1;}
int test_z() {test_b = test_b+8; return test_b + 2;}

int a = test_x() - test_y() + test_z();

核心问题

虽然C++里算术运算的结合性是明确的左到右(先计算test_x() - test_y(),再将结果与test_z()相加),但函数的执行顺序是不是必须跟这个运算顺序保持一致?这段代码属于未定义行为吗?(注:此问题和序列点无关,核心聚焦函数调用顺序)

实测多款编译器,运行结果始终为13。

结论与分析

  • 函数执行顺序没有强制要求和运算顺序一致:C++标准并未规定表达式中多个函数的调用顺序必须遵循算术运算的结合顺序。编译器有权选择任意合法的顺序调用这些函数,只要保证每个函数的返回值能在对应的运算步骤中被正确使用即可。
  • 这是未指定行为,而非未定义行为:未定义行为是指标准完全不约束结果(可能崩溃、输出任意值等),而未指定行为是标准允许不同实现产生不同的合法结果,但每个实现的行为是确定的。这里每个函数调用都是独立的完整操作,不存在同一序列点内对test_b的读写冲突,因此不属于未定义行为。
  • 实测结果统一为13的原因:大部分编译器为了贴合开发者的直觉,会按照代码的书写顺序(从左到右)调用函数,因此得到的结果都是13。但这只是编译器的实现选择,并非标准强制要求,编写可移植代码时不能依赖这个行为。

内容的提问来源于stack exchange,提问作者cprogrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:45:40