【C++】在MinGW-32编译器环境下,cout的逻辑出错情况分析(与正常编译器版本对比)

文章详细阐述了编译器和编辑器的区别,以VSCode和DevC++为例。重点讨论了C++中cout的计算逻辑(从右到左)和输出逻辑(从左到右),并对比了MinGW-w64和其他正常编译器环境与MinGW-32之间的差异。在MinGW-32中,cout的计算与输出逻辑均为从左到右,而在更新的编译器中则遵循标准逻辑。建议开发者注意这些差异,避免特定编译器导致的问题。

一、编译器的定义

编译器:就是将一种语言(通常为高级语言) 翻译为另一种语言(通常为低级语言)的 程序

  • 所以,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. 分析结果

  1. 首先,执行了Fun2()函数,输出了"Fun-2"
  2. 然后,执行了Fun1()函数,输出了"Fun-1"
  3. 最后,顺序输出了两个函数返回的1和2
  • 所以可以说明,在 MinGW-w64 或 其他正常编译器 环境下:

cout的计算逻辑:从 右 到 左
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计算顺序逻辑不同,涉及底层代码了,所以尽量避免这种写法吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值