C++中cout与printf区别

本文通过一个具体的C++程序示例介绍了如何在VC环境中检测系统的字节序(大小端)。文章详细分析了程序中出现的问题,并解释了cout与printf在处理不同类型数据时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VC环境C++测试一个判断系统是大小端的程序时候遇到了问题,如下(加入了改正后的cout与printf对比):

# include <iostream>
#include <iomanip>

using namespace std;
union endian
{
 int data;
 char ch;
};
void main()
{
 endian ed;
 ed.data = 0x12345678;
 if(ed.ch == (ed.data & 0xff))
 cout<<"The system is little dian."<<endl;
 else
 cout<<"The system is big dian."<<endl;
 for(int i=0;i<sizeof(int);i++)
 {
 printf("%#x--------%p\n",*(((char*)&ed.data)+i),((char*)&ed.data)+i);
 }

 cout.setf(ios::showbase | ios::uppercase);
 for(int i=0;i<sizeof(int);i++)
 {
 cout<<hex<<*(((char*)&ed.data)+i)<<"--------"<<hex<<((char*)&ed.data+i)<<endl;
 }
 for(int i=0;i<sizeof(int);i++)
 {
 cout<<hex<<(int)*(((char*)&ed.data)+i)<<"--------"<<hex<<(int)((char*)&ed.data+i)<<endl;
 }

 system("pause");
}

输出结果为:

The system is little dian.
0x78--------0012FF28
0x56--------0012FF29
0x34--------0012FF2A
0x12--------0012FF2B
x--------xV4烫烫€
V--------V4烫烫€
4--------4烫烫€
[]--------烫烫€
0X78--------0X12FF28
0X56--------0X12FF29
0X34--------0X12FF2A
0X12--------0X12FF2B

可以看到,cout<<hex<<*(((char*)&ed.data)+i);与cout<<hex<<(int)*(((char*)&ed.data)+i);输出结果不同,前者输出为乱码(未仔细分析结果)。

百度发现printf与cout的区别主要有:

cout<<是一个函数,cout<<后可以跟不同的类型是因为cout<<已存在针对各种类型数据的重载,所以会自动识别数据的类型。输出过程会首先将输出字符放入缓冲区,然后输出到屏幕。

所以我们回头看上面的问题,显然,cout<<hex<<*(((char*)&ed.data)+i);将*(((char*)&ed.data)+i)识别为char类型,所以按字符类型输出x,V,4,[]与十六进制对应为0x78,0x56,0x34,0x12(可以查阅ASCII码)。

特别注意:

printf与cout最好不要混用,因为cout流的维护比printf要高一层,cout要到回车或流刷新时才会输出。
而且ios::sync_with_stdio()决定了iostream是否和stdio同步,C++标准中规定stdio sync标志默认是true,但是有的平台下可能不会支持,或实现有差异。如果stdio sync是false的话,就可能出现输出顺序不对的情况。下列代码就是输出bbbaaa:

C/C++ code

#include <iostream>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cout << "aaa";
    printf("bbb");
    return 0;
} 

所以没有特殊要求,请不要混用iostream和stdio。
尤其是如果你的程序使用unicode编程的话,要在控制台输出要用wcout或者wprintf并设置本地编码。这两种输出方式设置编码的方式是不同的,而且无法兼容,一个设置对了,另外一个就不能正常工作了。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值