我正在学习C ++,我正在讨论安全和不安全的转换问题。这是我的代码:
#include <iostream>
using namespace std;
int main()
{
double d = 0;
while( cin >> d )
{
int i = d; // try to squeez in a double into an int
char c = i; // try to squeez in an int into a char
int i2 = c; // try to get the integer value of the char
cout << "d == " << d << "\n"
<< "i == " << i << "\n"
<< "c == " << c << "\n"
<< "i2 == " << i2 << "\n";
}
return 0;
}
当我输入3时,我得到以下内容:
d == 3
i == 3
c == a heart shape
i2 == 3
为什么c
打印出这样的听觉形状:link
答案 0 :(得分:1)
因为心脏字符是ASCII表的PC版本中值为3的符号。这是一个列表:http://www.ascii-codes.com/。假设您的程序在该环境中运行,您可能会在其中找到其他很好的代码。
答案 1 :(得分:1)
虽然char
是整数类型,但ostream
(cout
的类型)将其视为特殊。它将其打印为单个字符而不是数字。
如果您不想这样,只需通过写int(c)
而不是c
“强制”将其打印为数字。
当您开始提出有关安全和不安全转化的问题时,我会添加评论:int(c)
与(int)c
不同,您也会经常看到这些评论(遗憾的是) )。在这种情况下(使用int
)它具有相同的效果,但它具有不同的语义。第一个构造了现有int
值的char
值。第二个是使用C风格的的不安全转换,这应该在C ++中避免,因为它可以杀死你首先使用C ++获得的所有类型安全性。
答案 2 :(得分:1)
从i到c分配的值3被截断为字符的宽度。然后它表示ascii字符Ctrl-C或ETX,(0x03),它通常不是可打印字符。但是,许多终端类型无论如何都会尝试打印。根据您的终端,它可能会打印为心脏。在不知道终端的字符编码及其设置的情况下,很难确切地说出它为什么打印成心形。
答案 3 :(得分:0)
对于&#39; d&#39;,您正在输出一个double,它将转换为表示二进制格式的double内容的字符串。整数(你的i和i2)也是如此。
将char发送到屏幕而不进行转换,即以其发送。 Char 3,如果你在ASCII表中查找,并不真正代表任何东西 - 可打印的字符从32开始。所以,你会得到一个很奇怪的&#34;字符。
答案 4 :(得分:0)
您正在看到由值为'3'的字符表示的不可打印字符的呈现。
在您的代码中,变量c的值为3.这实际上是ASCII集中的“非打印控制字符”。 (字符'3'是ASCII 33)。
在尝试打印时,它具有心脏符号的表示。