4

我的代码是这样的:

#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,但结果有点奇怪,比如^@

有人对此有想法吗?

4

4 回答 4

12

^@就是您的终端模拟器呈现的方式'\0'

于 2013-02-10T07:12:16.167 回答
7

^@是空字符的常见表示。类似地,^A用于表示序数值为 1^G的字符、序数值为 7 的字符(铃)和^M序数值为 13 的字符(回车)。

cout << (char)0

只是打印字符表示,而不是整数表示

于 2013-02-10T07:13:38.843 回答
1

如果您正在查看终端的输出,您不知道是您的程序没有按预期运行,还是只是您的终端仿真器。

在 UNIXoid 系统上,用于./myProgram | hexdump -C查看十六进制输出。这样你就可以确保你的程序做你期望它做的事情,所以终端的行为不像(你)预期的那样:

00000000  30 0a 00 0a                                       |0...|
00000004

如果您看到的输出与我相同,那么您实际上是在打印 zero '0'、 newline '\n'、 null '\0'、 newline '\n'。因此,在这种情况下,您的程序会按照您的预期运行。

您可能想尝试不同的终端仿真器或设置。

于 2013-02-10T07:33:29.433 回答
0

如果您0转换为char,它不会生成'0',但是'\0'- 请记住从整数类型转换为使用该 ASCII 代码char创建 a 。char所以基本上,第二行输出一个空字符(ASCII 0)。

如果你想输出一个'0'字符,你需要做类似的事情(char) 48,因为 48 恰好是字符 0 的 ASCII 值。

于 2013-02-10T07:13:38.443 回答