int x; scanf()包含%d,printf()包含%c

Jav*_*tar 0 c format-specifiers conversion-specifier

int x; 因此变量将有2个字节的内存.现在,如果我输入66并且因为scanf()带有%d,66将存储在2字节内存中,因为该变量被声明为int.

现在在带有%c的printf()中,应该只从一个字节内存中收集数据来显示.

但是%c通过从内存中获取正确的数据66来正确显示B.

为什么%c不只是从一个字节获取数据?

Oli*_*rth 6

%c int由于vararg函数的默认参数提升,因此需要一个参数.换句话说,以下所有内容完全相同:

int x = 66;
char y = 66;
printf("%c", x);         // A
printf("%c", (char)x);   // B
printf("%c", y);         // C
printf("%c", (int)y);    // D
Run Code Online (Sandbox Code Playgroud)

所以所发生的一切printf就是将int66 的值解释为ASCII码1并打印相应的字符.


1.请注意,ASCII在技术上是一个实现定义的设计决策.只是一个绝对普遍的.