为什么MingW编译C++代码时输出顺序与预期不符?
问题原因
这不是编译器故障,是不同C++版本对表达式求值顺序的规则差异导致的:
- C17 标准发布之前,C 没有规定
<<运算符链式调用中各个子表达式的求值顺序。对于你写的cout << "字符串" << sum(参数) << endl;这类代码,编译器可以自由选择先执行sum函数调用,还是先输出前面的字符串。 - 你本地的 MingW 编译器默认使用低于 C++17 的标准编译代码,因此会先调用
sum函数,先执行sum内部的cout输出提示文本,之后再输出main函数中cout前面的字符串,最后输出sum的返回值,这就是你看到的实际输出结果。 - 在线编译器大多默认启用了 C17 或更高版本的标准,C17 明确规定
<<运算符的左操作数求值顺序优先于右操作数,因此会先输出前面的字符串,再调用sum函数输出提示,最后输出返回值,符合你的预期。
修复方法
你只需要在 VS Code 的编译参数中添加-std=c++17(或更高版本的-std=c++20),强制 GCC 使用 C++17 及以上标准编译即可:
- 如果你是通过
tasks.json配置编译任务,就在args配置项中加入"-std=c++17"参数即可。 - 如果是手动在终端编译,执行命令改为
g++ 你的文件名.cpp -o 输出文件名.exe -std=c++17。
内容的提问来源于stack exchange,提问作者Shubham Prakash
相关产品推荐
相关产品推荐

