为何仅该语句中类型转换失败?C++十六进制输出求助
这个问题我之前也碰到过,核心原因是C++里条件运算符(三目运算符)的类型提升规则在搞鬼!
为什么会出现这个问题?
当你写语句:
cout << (a > 9 ? (char)('A' + a - 10) : a);
时,三目运算符会自动对两个分支的类型进行统一。假设你的变量a是int类型(这是最常见的情况),第一个分支的char类型会被隐式提升为int——因为char本质上是小范围的整数类型,编译器会把它转换成更宽泛的int类型来匹配第二个分支的类型。
这就导致整个三目表达式的结果类型是int,哪怕你给第一个分支做了(char)强制转换,最终返回的还是该字符对应的ASCII整数值。cout接收到int类型的输出值,自然就会打印整数而非字符了。
而单独执行cout << (char)('A' + a - 10);时,没有类型统一的过程,直接输出char类型,所以能正常显示对应的字母。
解决方法
这里提供几种可行的方案:
方案一:统一两个分支的类型为char
把第二个分支也转换成char类型,让三目运算符的结果类型保持为char:cout << (a > 9 ? static_cast<char>('A' + a - 10) : static_cast<char>(a));注:
static_cast<char>是C++风格的类型转换,比C风格的(char)更规范,可读性也更强,当然后者也能正常工作。方案二:强制转换整个三目表达式的类型
直接把整个三目运算的结果转换成char,跳过内部的类型提升影响:cout << static_cast<char>(a > 9 ? ('A' + a - 10) : a);这个写法更简洁,因为内部的
'A' + a -10本身就是int类型,和a类型一致,转换为char后cout会按字符输出。额外小技巧:利用标准库简化实现
其实C++标准库已经内置了十六进制输出的功能,如果你不需要手动实现逻辑,可以直接用:cout << hex << uppercase << a;这行代码会自动把整数
a转换成大写的十六进制字符输出,省心又不容易出错。
内容的提问来源于stack exchange,提问作者L.Amanda

