首页 > 解决方案 > 为什么八进制序列 '\0101' 不等于十进制 65?

问题描述

考虑这个 C 程序:

unsigned char c2 = '\0101';
printf("%c, %d\n", c2, c2);

我相信输出应该是:A 65但实际输出是1 49

推理: 0 作为字符常量中的前缀以八进制格式声明,101 的八进制值是 65。那么 65 对应的 ASCII 值是 A。有人能告诉我哪里出错了吗?我尝试了与 '\x41' 相同的十六进制代码,它给出了所需的输出。

标签: coutput

解决方案


八进制格式字符的转义序列是一个反斜杠,后跟最多三位数字,这意味着最后一个数字不是转义序列的一部分。这在C 标准关于“字符常量”的第 6.4.4.4p1 节中指定:

octal-escape-sequence:
  \ octal-digit
  \ octal-digit  octal-digit
  \ octal-digit  octal-digit  octal-digit

所以'\0101'实际上是一个多字节字符常量:第一个是\010值 8,第二个是字符'1'

前导0用于指定数字八进制常量,而不是字符八进制常量,因此在这种情况下您不需要前导 0:

unsigned char c2 = '\101';

如果您确实想使用数字八进制常量,您可以这样做:

unsigned char c2 = 0101;

推荐阅读