为什么x-x在c语言的putchar()中什么都不是?

为什么x-x在c语言的putchar()中什么都不是?,c,putchar,C,Putchar,在下面的代码中,如果输入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,

在下面的代码中,如果输入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值进行思考。当执行x=x-x时,表示x=0(我为x减号本身键入的任何字符的ascii码始终为0)

然后在ASCII表中查找0,您将看到null。因此,它将打印null(看起来像一个空格)和1

当执行x-=3;,您需要输入字符的数字ascii码,然后减去3。如果查看ASCII表,您会注意到字符1之前的3个字符是*并且字符2之前的3个字符是/。这就解释了你得到的结果

如果要将字符转换为它所表示的数值,有很多方法可以做到这一点,您可以在C中将字符转换为字符串后减去“0”或使用atoi函数

-“0”方法

int numeric = x - '0';
atoi方法需要


如果您键入的是非数字字符,例如aa

您希望发生什么?什么字符是ASCII 0?x和y将保存您输入的任何值的ASCII编码,则这两个字符都没有意义。因此,当您输入
11
时,x和y都将保留ASCII编码if 1,即整数“49”。对于上面带有
x=x-x
的代码,将保留零,即x中的空字符。所以,putchar不会打印任何东西。因此,如果从49中减去3,则得到46,这是
的ASCII编码,这就是本例中putchar的输出。为了学究式,C标准对实现中可能使用的字符编码没有什么限制,并且不需要ASCII。限制之一是空字符
\0
(或有时缩写为
NUL
)的值为0,而与实际使用的编码无关。此字符用于终止C中的字符串。EBCDIC是另一种已在实现中使用的编码,但现在已不太常见。UTF-8包含ASCII作为子集,可能是系统上使用的实际编码。在所有这些编码中,空字符的值为0。
char str[2] = "\0";
str[0] = x;
int numeric = atoi(str);