我的代码是这样的:
#include <iostream>
using std::cout;
using std::endl;
int main(int argc, char *argv[])
{
cout << (int)('\0') << endl;
cout << (char)(0) << endl;
return 0;
}
我希望在终端上看到这样的话:
$ test-program
0
$
但是,我看到的是这样的:
$ test-program
0
^@
$
令我困惑的是,我认为'\0'
可以转换为0
。 0
也可以投放到\0
。我希望看到一个空字符后跟endl
,但结果是奇怪的^@
。
有没有人有这方面的想法?
答案 0 :(得分:12)
^@
就是终端模拟器呈现'\0'
的方式。
答案 1 :(得分:7)
^@
是空字符的常见表示。同样,^A
用于表示序数值为1的字符,^G
表示序数值为7(bell)的字符,^M
表示序数值为13的字符(回车率) )。
cout << (char)0
只是打印字符表示,而不是整数表示
答案 2 :(得分:1)
如果你正在查看终端的输出,你不知道你的程序是不是按预期运行,也可能只是你的终端模拟器。
在UNIXoid系统上,使用./myProgram | hexdump -C
查看十六进制输出。通过这种方式,您可以确保您的程序执行您期望的操作,因此终端的行为不符合您的期望:
00000000 30 0a 00 0a |0...|
00000004
如果您看到的输出与我相同,则实际上打印的是零'0'
,换行符'\n'
,空'\0'
,换行符'\n'
。所以在这种情况下,你的程序就像你期望的那样。
您可能想尝试不同的终端模拟器或设置。
答案 3 :(得分:0)
如果您将0
投射到char
,则不会生成'0'
,但'\0'
- 请记住从整数类型转换为char
使用该ASCII代码创建char
。
所以基本上,第二行输出一个空字符(ASCII 0)。
如果要输出'0'
字符,则需要执行(char) 48
之类的操作,因为48恰好是字符0的ASCII值。