C++函数实参求值顺序问题:输入顺序为何与预期不符?
C++函数参数求值顺序导致输入顺序颠倒的问题
这是C++标准里的明确规则:函数实参的求值顺序是未指定的。编译器可以选择任意顺序计算传递给函数的参数表达式——既可以从左到右,也可以从右到左,甚至按内部优化后的其他顺序执行。
你的情况里,编译器恰好选择了从右到左的顺序计算addNumber(inputFirstNumber(), inputSecondNumber())的两个参数:先执行右边的inputSecondNumber()(因此先要求输入第二个数),再执行左边的inputFirstNumber()(再要求输入第一个数)。当你交换参数顺序后,编译器仍按同样的右到左顺序求值,此时右边变成inputFirstNumber(),左边是inputSecondNumber(),输入顺序自然符合预期。
举个简单例子验证这个行为:
#include <iostream> int getA() { std::cout << "输入A: "; int x; std::cin >> x; return x; } int getB() { std::cout << "输入B: "; int x; std::cin >> x; return x; } void print(int a, int b) {} int main() { print(getA(), getB()); return 0; }
在GCC、Clang等多数编译器上运行这段代码,你会发现程序先提示“输入B:”,再提示“输入A:”——这就是编译器选择右到左求值的结果。
要避免这种不可控行为,最稳妥的方式是提前将有副作用的函数结果存入变量,再把变量作为参数传递:
int first = inputFirstNumber(); int second = inputSecondNumber(); addNumber(first, second);
这样不管编译器采用哪种参数求值顺序,输入顺序都会严格按照变量定义的顺序执行,完全可控。
内容的提问来源于stack exchange,提问作者Andrey Dhomochevsky
相关产品推荐
相关产品推荐

