每次我向cout对象发送一个char时,它都会以ASCII字符显示,除非我将它转换为int。
问:有没有办法在没有明确演员的情况下显示char的数值?
我在某处读到过在代码中执行太多强制转换会导致(程序的)完整性丢失。我猜这些字符以特殊原因显示在ASCII中,但我不确定原因。
我实际上是在创造一款游戏。我正在使用我计划显示到控制台的小数字(无符号字符)。我可能是偏执狂,但每当我在代码中的任何地方发送static_cast<int>
垃圾邮件时,我都会感到不安。
答案 0 :(得分:5)
但是,类型转换没有任何问题,特别是如果您使用static_cast
来执行此操作。这就是你应该使用的。它允许编译器验证类型转换并确保它是安全的。
要更改<<
运算符的行为,您必须覆盖<<
值的默认char
运算符,例如:
std::ostream& operator <<(std::ostream &os, char c)
{
os << static_cast<int>(c);
return os;
}
char c = ...;
std::cout << c;
您可以创建一个自定义类型,将char
作为输入,然后为该类型实现<<
运算符,例如:
struct CharToInt
{
int val;
CharToInt(char c) : val(static_cast<int>(c)) {}
};
std::ostream& operator <<(std::ostream &os, const CharToInt &c)
{
os << c.val;
return os;
}
char c = ...;
std::cout << CharToInt(c);
你可以创建一个类似的函数,然后你不必覆盖<<
运算符,例如:
int CharToInt(char c)
{
return c;
}
char c = ...;
std::cout << CharToInt(c);
答案 1 :(得分:0)
随着时间的推移,这是合理使用演员,但是可以改进。所涉及的“完整性的丧失”就是如果其中一个数据类型从char更改为双倍,则演员将继续编译但可能不会执行您想要的操作。您可以改为创建辅助函数:
inline int to_int(char c) { return static_cast<int>(c); }
与static_cast不同,这只会在原始类型为char
时启动,因此如果您更改为double
之类的内容,则会收到编译器警告 - 实际上是提醒您查看代码