第二章(第2.3节命名常量)的K&R书关于C编程语言:
某些字符可以通过转义序列(如换行符)以字符和字符串常量表示;这些序列看起来像两个字符,但只表示一个字符。此外,任意字节大小的位模式可以由
′\ooo′其中ooo是1到3个八进制数字(0.7)或by
′\xhh′其中hh是一个或多个十六进制数字(0.9,a.f,A.F)。所以我们可以写
#define VTAB ′\013′ /* ASCII vertical tab */
#define BELL ′\007′ /* ASCII bell character */
or, in hexadecimal,
#define VTAB ′\xb′ /* ASCII vertical tab */
#define BELL ′\x7′ /* ASCII bell character */让我困惑的部分是以下几个字(强调我的):其中ooo是,1到3个八进制数字(0.7)。如果有三个八进制数字,所需的位数将为9(每个数字为3),这超过了字符所需的字节长度。我肯定是漏掉了什么东西。我错过了什么?
发布于 2013-08-09 18:31:45
\ooo (3位八进制数字)确实允许指定0到111111111 (二进制)或511的9位值。如果允许这样做,则取决于char大小。
下面这样的赋值会在许多环境中生成警告,因为char是这些环境中的8位。通常,允许的最高八进制序列是\377。但是char不需要8位。OP的“9.超过字符所需的字节长度”是不正确的。
char *s = "\777"; //warning "Octal sequence out of range"
char c = '\777'; //warning
int i = '\777'; //warning在使用ASCII的典型环境中,3八进制数字常数'\141'与'a'相同。但是在另一个字符集中,'a'可能是不同的。因此,如果想要01100001的可移植位模式分配,可以使用'\141'而不是'a'。一个人可以通过分配'\x61'来完成同样的任务。在某些情况下,八进制模式可能是首选的。
C11 6.4.4.4.9如果没有使用前缀,“八进制或十六进制转义序列的值应在对应类型的可表示值范围内:无符号字符”
发布于 2013-08-09 17:39:35
如果我们说的是8位字节,那么第一个八进制数字只允许为3(2位),而不是7(3位)。如果我们讨论的是ASCII (7位值),那么第一个数字只能是0或1。
如果K&R不这么说,他们的描述要么不完整,要么不正确。
发布于 2013-08-09 17:45:59
据我所知,在K&R中没有定义字符的代码编号范围。在早期,通常是ASCII 0.127。现在它通常是一个8位的范围,0.255,但它也可能更宽.无论如何,对char数据类型的实现定义的限制也意味着对转义符号的限制。
例如,如果范围为0.127,则\177是允许的最大八进制转义。
https://stackoverflow.com/questions/18152526
复制相似问题