这段 static_cast 代码有什么问题?

what is wrong this static_cast piece of code?

我在c++中有这段代码

char a;
cin>>a; //I input 3 in this
a=static_cast<int>(a);
cout<<a+9<<endl;
a=static_cast<int>(4.2)
cout<<a;

结果如下: 51 60 4

我原本希望 static_cast(a) 产生 3。谁能告诉我我误解了什么?

让我们一步一步来。

char a;

声明一个字符类型。到目前为止,一切都很好。

cin>>a; 

输入字符或数字的文本表示。如果您输入“3”,您将输入 3 的文本版本。在 ASCII 系统上,这将是 0x33(或十进制的 51)。

a=static_cast<int>(a);

顺便说一下,这条语句前面的a中的值是一个数字(你输入的字符的ASCII码)。

您是在告诉编译器将整数类型 char 转换为整数类型 int(您正在从较小容量的整数类型转换为较大容量的整数类型)。 接下来,您将 int type 赋值给char 类型。 (您正在从容量较大的类型 int 转换为容量较小的类型 char。) 由于它们都是数字,因此基本上没有任何反应。编译器可能会对此进行优化。

cout<<a+9<<endl;  

您将字符 a 中的字符推进 9 编码。如果您输入字符 'A',您现在将得到 'J'(根据 ASCII)。然后输出字符和换行符。

a=static_cast<int>(4.2)  

此处,您正在将 浮点数 转换为 整数 。浮点数被截断为 4。接下来,值 4 (0x04) 的长度被截断以适合 char 类型并分配给变量 a.

cout<<a;

这一行输出字符\x04。在 ASCII 中,这是一个不可打印的字符,EOT

您可能需要的是从字符串到整数或从整数到字符串的转换。

记住在大多数文本编码系统上 4 != '4'。