4

每次我将 char 发送到 cout 对象时,它都会以 ASCII 字符显示,除非我将其转换为 int。

问:有没有办法在不显式转换的情况下显示 char 的数值?

我在某处读到,在您的代码中进行过多的强制转换可能会导致(您的程序)失去完整性。我猜测字符以 ASCII 显示是出于特定原因,但我不确定为什么。

我本质上是在创造一个游戏。我正在使用我计划显示到控制台的小数字(无符号字符)。static_cast<int>我可能是偏执狂,但每当我在代码中到处发送垃圾邮件时,我都会感到不安。

4

2 回答 2

5

不过,类型转换并没有错,特别是如果你习惯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);
于 2012-06-28T01:07:04.297 回答
0

随着事情的发展,这是对演员表的合理使用,但是是的,它可以改进。所涉及的“完整性丧失”只是如果其中一种数据类型从 char 更改为 double ,则强制转换将继续编译,但可能不会执行您想要的操作。您可以创建一个辅助函数:

inline int to_int(char c) { return static_cast<int>(c); }

与 static_cast 不同,这只会在原始类型为 时启动char,因此如果您更改为类似的内容,double您会收到编译器警告 - 实际上是提醒您查看代码。

于 2012-06-28T01:01:46.720 回答