通过整数限定符打印char

时间:2013-08-12 09:36:15

标签: c++

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

#‎include‬ "stdio.h" 
#include "string.h" 

void main()
{ 
    char c='\08'; 
    printf("%d",c); 
} 

我的输出为56。但对于除8以外的任何数字,输出都是数字本身,但对于8,答案为56

有人可以解释一下吗?

4 个答案:

答案 0 :(得分:18)

\0开头的字符代表Octal number,是基数为8的系统,使用数字0 to 7。因此\08 无效表示octal数字,因为 8∉[0,7] ,因此您将获得实现定义行为。

您的编译器可能会将Multibyte Character '\08'识别为'\0'一个字符而将'8'识别为另一个字符,并将'\08'解释为'\0' + { {1}}使其成为'8'。查看ASCII表后,您会注意到'8'的十进制值为56。


感谢@DarkDust,@ GrijeshChauhan和@EricPostpischil。

答案 1 :(得分:7)

'\08'被视为多字符常量,由\0(计算结果为0)和ASCII字符{{1}组成}(计算结果为十进制56)。如何解释是实现定义的。 C99标准说:

  

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

因此,如果您将8分配给大于'\08'的内容,例如charint,它甚至会有效。但是,既然你将它分配给long,你就会“切断”某些部分。哪个部分可能还依赖于实现/机器。在您的情况下,它恰好为您提供char的值(ASCII字符,其值为56)。

GCC和Clang都用“警告:多字符字符常量”警告此问题。

答案 2 :(得分:4)

\0用于表示C / C ++中的八进制数。八进制基数来自0->7,因此\08是一个多字符常量,由\0组成,编译器将\08解释为\0 + {{1} },这使得8的ascii值为'8'。这就是为什么你得到56作为输出。

答案 3 :(得分:4)

正如其他答案所说,这些数字代表八进制字符(基数为8)。这意味着你必须为8写'\010',为9等写'\011'

还有其他方法来编写您的作业:

char c = 8;
char c = '\x8'; // hexadecimal (base 16) numbers