一、编译器的定义
编译器:就是将一种语言(通常为高级语言) 翻译为另一种语言(通常为低级语言)的 程序
- 所以,VSCode 不是 编译器,VSCode 是 编辑器。
- 而 Dev C++ 通常是集合了编译器、编辑器的 IDE(集成开发环境)
常用的 C++ 编译器有 gcc、MinGW-w64
二、C++ 在正常编译器环境下的 cout 逻辑
( 正常编译器环境,指 MinGW-w32、gcc 等主流编译器环境,不包括 MinGW-32 )
1. 两种逻辑
- 简单来说,cout 分为计算逻辑和输出逻辑,下面是两者逻辑与区别:
计算逻辑:从 右 到 左
输出逻辑:从 左 到 右
2. 示例代码
#include <iostream>
int Fun1(){
std::cout<<"Fun-1"<<std::endl;
return 1;
}
int Fun2(){
std::cout<<"Fun-2"<<std::endl;
return 2;
}
int main(){
std::cout<<Fun1()<<" "<<Fun2()<<std::endl;
return 0;
}
- 在 MinGW-w64编译器(或其他正常编译器环境)运行的结果为:
3. 分析结果
- 首先,执行了Fun2()函数,输出了"Fun-2"
- 然后,执行了Fun1()函数,输出了"Fun-1"
- 最后,顺序输出了两个函数返回的1和2
- 所以可以说明,在 MinGW-w64 或 其他正常编译器 环境下:
cout的计算逻辑:从 右 到 左
cout的输出逻辑:从 左 到 右
可以用顺序栈来理解,见下图:
- 同样可以试分析其他示例代码结果,例如:
#include<iostream>
int main(){
int i = 4;
std::cout<<i<<" "<<++i<<std::endl;
}
结果是:5 5,而非4 5
三、C++ 在 MinGW-32 中的 cout 逻辑
1. 逻辑
若使用 MinGW-32,则计算与输出逻辑均为:从 左 到 右
2. 示例代码
#include<iostream>
int main(){
int i = 4;
std::cout<<i<<" "<<++i<<std::endl;
}
结果为 4 5,
而我们已经在前面分析得知,在 MinGW-w64 下运行结果为 5 5
(点此跳转至 MinGW-w64 下运行结果)
四、原因
MinGW-32 编译器是 MinGW-w64 编译器的前身,是 windows 平台下的轻量级 C/C++ 开发环境,但是已经不再维护更新了,因此会出现某些问题(例如本文介绍的 cout 逻辑差异)。
在 MinGW-w64、TDM-GCC 等编译器下 cout 逻辑为(正常正确逻辑)
计算顺序:从 右 到 左
输出顺序:从 左 到 右
在 MinGW-32 编译器下 cout 逻辑为(落后错误逻辑)
计算顺序和输出顺序均为:从 左 到 右
五、结论
具体什么原理大概是不同编译器版本的cout计算顺序逻辑不同,涉及底层代码了,所以尽量避免这种写法吧