通过整数限定符打印char

Ara*_*ran 8 c c++

我正在尝试执行以下程序.

#?include? "stdio.h" 
#include "string.h" 

void main()
{ 
    char c='\08'; 
    printf("%d",c); 
} 
Run Code Online (Sandbox Code Playgroud)

我得到了输出56.但对于除此之外的任何数字8,输出都是数字本身,但8答案是56.

有人可以解释一下吗?

Mar*_*oun 18

与开头的字符\0代表八进制数,是基-8号系统,并使用该数字0 to 7.因此\08无效的表示八进制数,因为8∉[0,7] ,因此,你要实现定义的行为.

也许你的编译器识别多字节字符 '\08'作为'\0' 一个字符,而'8'另一个并解释为'\08''\0'+ '8'这使得它'8'.查看ASCII表后,您会注意到十进制值为'8'56.


感谢@DarkDust,@ GrijeshChauhan和@EricPostpischil.

  • @MarounMaroun:这不是未定义的行为; 它是实现定义的行为.根据C 2011(N1570)6.4.4.4 1,字符常量可以是字符序列.在''\ _8'中,`\ 0`被识别为一个字符而'8`被识别为另一个字符.这称为多字节字符(不是多字符常量).根据6.4.4.4 2,它以实现定义的方式映射到执行字符集的成员. (3认同)
  • GCC和clang都抱怨它是一个多字符常量,因此它们似乎将它解释为'\ 0'+'8'.事实上,'8'== ASCII十进制56. (2认同)
  • 请,无论是谁投票,请解释为什么我可以从错误中吸取教训,这个问题非常有趣,我真的想知道我是对还是错. (2认同)
  • @GrijeshChauhan:这些不是多字符常量.它们是多字节字符.AC实现可以支持大于基本字符集的字符集.它们可能包括重音字符或来自不同语言或符号的字母.多字节字符是编写代表这些字符的源代码的一种方式. (2认同)

Dar*_*ust 8

该值'\08'被认为是一个多字符常量,由\0(计算结果为0)和ASCII字符8(计算结果为十进制数56)组成.如何解释是实现定义的.C99标准说:

整数字符常量的类型为int.包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值.包含多个字符(例如,'ab')的整数字符常量的值,或包含不映射到单字节执行字符的字符或转义序列的值是实现定义的.如果整数字符常量包含单个字符或转义序列,则其值是当char类型的对象(单值字符或转义序列的值)转换为int类型时生成的值.

因此,如果您要分配'\08'比a更大的东西char,比如intlong,它甚至会有效.但是,既然你把它分配给char你"切断"某些部分.哪个部分可能还依赖于实现/机器.在你的情况下,碰巧给你的值8(ASCII字符,其值为56).

GCC和Clang都用"警告:多字符字符常量"来警告这个问题.