【C++】在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计算顺序逻辑不同,涉及底层代码了,所以尽量避免这种写法吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值