8

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

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

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

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

有人可以解释一下吗?

4

4 回答 4

18

以 开头的字符\0表示八进制数,是以 8 为基数的数字系统,使用数字0 to 7八进制\08数的无效表示也是如此,因为8 ∉ [0, 7],因此您将获得实现定义的行为。

可能您的编译器将多字节字符 '\08'识别为'\0' 一个字符和另一个字符,并将其'8'解释'\08''\0'+ 。查看ASCII表后,您会注意到十进制值为56。'8''8''8'


感谢@DarkDust、@GrijeshChauhan 和@EricPostpischil。

于 2013-08-12T09:41:21.437 回答
8

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

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

因此,如果您要分配'\08'比 a char、 likeint或更大的东西long,它甚至是有效的。但是由于您将其分配给char您正在“砍掉”某些部分。哪个部分可能也取决于实现/机器。在您的情况下,它恰好为您提供了8(评估为数字 56 的 ASCII 字符)的值。

GCC 和 Clang 都使用"warning: multi-character character constant" 警告这个问题。

于 2013-08-12T09:53:05.607 回答
4

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

于 2013-08-12T09:43:51.953 回答
4

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

还有其他写作业的方法:

char c = 8;
char c = '\x8'; // hexadecimal (base 16) numbers 
于 2013-08-12T09:47:23.803 回答