1. 背景:
在工程中,我通过cout打印一个被频繁调用的函数里面某个参数的值,在前面若干次调用中,cout << 工作正常,是打印的10进制,突然,不清楚什么原因,就开始打印16进制的值,而且是不加0x的16进制,导致我一直以为是10进制,但是加条件断点加不上去,通过if条件也进不去对应的分支,直到我使用printf打印参数的值,才发现打印的值是16进制显示的。。
2. cout << 原理
cout是一个对象(object),类型是ostream,ostream重载了运算符 <<。
3. cout << 如何输出x的16进制
方法1: cout << std::hex << std::showbase << x;
方法2: cout.flags(std::ios::hex | std::ios::showbase);
并且,上面的设置是全局设置,只要你在某个地方设置了上面的输出格式,程序成功执行了该语句之后,程序接下来的执行cout时都会按照16进制输出;
为什么是全局设置呢?因为cout是个全局对象,通过方法1和方法2其实是修改了cout内部的属性。
依据上面的理解,我检查了下我的代码,发现确实是在某个时候,程序在进行cout输出的通过方法1设置了输出格式,并且只是设置了std::hex,而没有设置std::showbase,所以是不带0x的16进制输出;正式由于不带0x前缀导致我很疑惑,所以强烈建议 在16进制输出的时候,加上std::showbase; 减少疑惑。