我正在尝试执行以下程序。
#include "stdio.h"
#include "string.h"
void main()
{
char c='\08';
printf("%d",c);
}
我的输出为56
。但对于除8
以外的任何数字,输出都是数字本身,但对于8
,答案为56
。
有人可以解释一下吗?
答案 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'
的内容,例如char
或int
,它甚至会有效。但是,既然你将它分配给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