将两位数字打印为字符

use*_*345 0 c printf ascii character

我有这行代码:

printf("%c\n", '65');
Run Code Online (Sandbox Code Playgroud)

此代码打印5到控制台.

我知道这65不是一个有效的字符,并没有分配给任何ASCII值,那么这个输出背后的原因是什么?

Iha*_*imi 5

单引号给出字符的ascii值,称为字符常量

printf("%c\n", '65');
Run Code Online (Sandbox Code Playgroud)

是一个multicharacter constant,这是实现定义

65是'A'字符的ascii值所以我想你的意思

printf("%c\n", 'A');
Run Code Online (Sandbox Code Playgroud)

这相当于

printf("%c\n", 65);
Run Code Online (Sandbox Code Playgroud)

使用多字符字符常量是实现定义的.例如gcc说,

编译器一次评估一个字符的多字符字符常量,将前一个值移动每个目标字符的位数,然后在截断到目标宽度的新字符的位模式中输入字符.最终的位模式为int类型,因此无论单个字符是否有符号都是有符号的(与版本3.1及更早版本的GCC略有不同).如果常量中的字符数多于目标int中的字符数,则编译器会发出警告,并忽略多余的前导字符.

例如,'ab'对于具有8位char的目标,将被解释为' (int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')',并且' \234a'作为' (int) ((unsigned char) '\234' * 256 + (unsigned char) 'a')'.

参考

所以gcc你会得到5自

printf("%c\n", '65');
Run Code Online (Sandbox Code Playgroud)

是等价的

printf("%c\n", (int)(((unsigned char)'6' * 256) | (unsigned char)'5'));
Run Code Online (Sandbox Code Playgroud)

最后从问题的标题来看,这似乎是你想要的

printf("%d\n", 65);
Run Code Online (Sandbox Code Playgroud)

即打印十进制值65.

  • 第一句话说"没有多字符字符常量",然后你引用并引用GCC如何实现它们?多字符字符常量*在语言中是*,具有实现定义的实际值. (2认同)