【发布时间】:2018-08-07 02:01:36
【问题描述】:
在下面的代码中,如果我输入 11(1 和 1),则输出为:[]1。 [] 部分不是垃圾,我只是使用符号(“[]”)来表示空输出。因此,如果在 1 的前面,真正的输出只有 1 和一个空格。
int main(void)
{
int x = 1;
char y = 1;
x = getchar();
y = getchar();
x = x - x;
putchar(x);
putchar(y);
}
另外,如果我替换 x = x - x;到
x -= 3;
然后输入 11 或 22,它会给我像 *1 或 /2 这样的输出。
为什么会这样?
谢谢。
【问题讨论】:
-
你期望发生什么?
-
ASCII 0 是什么字符?
-
x 和 y 将保存您输入的任何值的 ASCII 编码。因此,当您输入
11时,x 和 y 都将保存 ASCII 编码,如果为 1,即整数 '49'。对于上面带有x = x - x的代码,这将留下零,即x 中的NULL 字符。所以, putchar 不会打印任何东西。所以,如果你从 49 中减去 3,你会得到 46,这是.的 ASCII 编码,这就是 putchar 在这种情况下会输出的内容。 -
为了迂腐,C 标准对可能在实现中使用的字符编码几乎没有限制,并且不需要 ASCII。限制之一是空字符
\0(或有时缩写为NUL)的值为0,而不管使用的实际编码如何。此字符用于终止 C 中的字符串。EBCDIC 是另一种已在实现中使用的编码,但如今已不常见。 UTF-8 包含 ASCII 作为子集,并且可能是您系统上使用的实际编码。在所有这些编码中,空字符的值为 0。