为何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
相关产品推荐
相关产品推荐

