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

为何C++函数调用实参的执行顺序不遵循指定顺序?

为什么第一个代码的输出是随机的?

这本质是C++里函数参数的求值顺序规则导致的:

  • 在第一个例子中,foo(get_num(), get_num());里的两个get_num()调用是作为函数的实参传递的。C标准(直到C17之前)明确规定,函数多个实参的求值顺序是未指定行为——编译器可以自由选择先计算左边的实参,还是右边的实参,没有强制要求。这就导致两次get_num()的执行顺序不确定:如果先算左边,输出就是1, 2;如果先算右边,输出就是2, 1。

    即使是C++17之后,虽然对某些表达式的求值顺序做了明确,但函数参数的求值顺序依然是未指定的(除了逗号运算符、&&/||这类有顺序保证的操作符),所以这个例子的行为依然不确定。

  • 第二个例子里,auto a = get_num();和auto b = get_num();是两个独立的语句。C++的序列规则保证,前一个语句的所有操作都会完全执行完毕后,才会执行下一个语句。所以get_num()的调用顺序是确定的:先执行第一个get_num()给a赋值(i变成1),再执行第二个给b赋值(i变成2),最后传递给foo的就是确定的1和2,输出自然固定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:09:58