每次我将 char 发送到 cout 对象时,它都会以 ASCII 字符显示,除非我将其转换为 int。
问:有没有办法在不显式转换的情况下显示 char 的数值?
我在某处读到,在您的代码中进行过多的强制转换可能会导致(您的程序)失去完整性。我猜测字符以 ASCII 显示是出于特定原因,但我不确定为什么。
我本质上是在创造一个游戏。我正在使用我计划显示到控制台的小数字(无符号字符)。static_cast<int>
我可能是偏执狂,但每当我在代码中到处发送垃圾邮件时,我都会感到不安。
不过,类型转换并没有错,特别是如果你习惯static_cast
这样做的话。这就是你应该使用的。它允许编译器验证类型转换并确保它是安全的。
要更改<<
运算符的行为,您必须覆盖值的默认<<
运算符char
,例如:
std::ostream& operator <<(std::ostream &os, char c)
{
os << static_cast<int>(c);
return os;
}
char c = ...;
std::cout << c;
您可以创建一个以 achar
作为输入的自定义类型,然后<<
为该类型实现运算符,例如:
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);
随着事情的发展,这是对演员表的合理使用,但是是的,它可以改进。所涉及的“完整性丧失”只是如果其中一种数据类型从 char 更改为 double ,则强制转换将继续编译,但可能不会执行您想要的操作。您可以创建一个辅助函数:
inline int to_int(char c) { return static_cast<int>(c); }
与 static_cast 不同,这只会在原始类型为 时启动char
,因此如果您更改为类似的内容,double
您会收到编译器警告 - 实际上是提醒您查看代码。