1
 #include<stdio.h>
 int main()
 {
          int i=0;
          printf("%d:%4d\n",++i,'\1');
          printf("%d:%4d\n",++i,'\2');
          printf("%d:%4d\n",++i,'\3');
          printf("%d:%4d\n",++i,'\4');
          printf("%d:%4d\n",++i,'\5');
          printf("%d:%4d\n",++i,'\6');
          printf("%d:%4d\n",++i,'\7');
          printf("%d:%4d\n",++i,'\8');
          printf("%d:%4d\n",++i,'\9');
          printf("%d:%4d\n",++i,'\10');
          printf("%d:%4d\n",++i,'\11');
          printf("%d:%4d\n",++i,'\12');
          printf("%d:%4d\n",++i,'\13');
          printf("%d:%4d\n",++i,'\14');
          printf("%d:%4d\n",++i,'\15');
          printf("%d:%4d\n",++i,'\16');
          printf("%d:%4d\n",++i,'\17');
          printf("%d:%4d\n",++i,'\18');
          printf("%d:%4d\n",++i,'\19');
          printf("%d:%4d\n",++i,'\20');
          printf("%d:%4d\n",++i,'\21');
          printf("%d:%4d\n",++i,'\22');
          printf("%d:%4d\n",++i,'\23');
          printf("%d:%4d\n",++i,'\24');
          printf("%d:%4d\n",++i,'\25');
          printf("%d:%4d\n",++i,'\26');
          printf("%d:%4d\n",++i,'\27');
          printf("%d:%4d\n",++i,'\28');
          printf("%d:%4d\n",++i,'\29');
          printf("%d:%4d\n",++i,'\30');
          return 0;
 }

输出:

1:   1
2:   2
3:   3
4:   4
5:   5
6:   6
7:   7
8:  56    
9:  57
10:   8
11:   9
12:  10
13:  11
14:  12
15:  13
16:  14
17:  15
18: 312
19: 313
20:  16
21:  17
22:  18
23:  19
24:  20
25:  21
26:  22
27:  23
28: 568
29: 569
30:  24

'\1' 不等于 ASCII 值为 1 的字符吗?
在输出中,为什么 8,9,18,19,28,29... 的数字不按顺序排列? http://codepad.org/I1N6A71j

4

5 回答 5

2

转义序列应该是八进制的,因此 \8 和 \9 是不允许的,并且会导致未指定的行为。结果取决于您使用的编译器;在这种情况下,它忽略了转义并将“8”和“9”作为普通的 ascii-char 处理。

要获得正确的 (ascii-char) 结果,您应该使用 \x8 和 \x9。

于 2012-05-06T14:01:20.723 回答
2

从 2.14.3 开始:

转义\ooo由反斜杠组成,后跟一个、两个或三个八进制数字,用于指定所需字符的值。转义\xhhh由反斜杠后跟x一个或多个十六进制数字组成,用于指定所需字符的值。十六进制序列中的位数没有限制。八进制或十六进制数字序列分别由不是八进制数字或十六进制数字的第一个字符终止。

由于\8并且\18不是有效的八进制序列,这些文字的含义取决于您的平台:

反斜杠后面的字符未在表 7 中列出的转义序列是有条件支持的,具有实现定义的语义。

于 2012-05-06T14:02:13.353 回答
1

这是编译器输出(MinGW):

a.c: In function 'main':
a.c:12:33: warning: unknown escape sequence: '\8'
a.c:13:33: warning: unknown escape sequence: '\9'
a.c:22:33: warning: multi-character character constant
a.c:23:33: warning: multi-character character constant
a.c:32:33: warning: multi-character character constant
a.c:33:33: warning: multi-character character constant

其中一些转义序列在 c 中是无效的。转义序列在 C 中是八进制的。如果你有一个体面的编辑器,你也可以很容易地检测到这一点。我的 ViM 标记\8\9红色,因为它们无效。

于 2012-05-06T14:00:25.997 回答
0

在需要格式化 d 修饰符之前使用 hh !!!所以你使用 d 格式它假定 int32 值,但你只使用 char - 8 位值!是内存错误访问!!!只有 c99 可用或 c++11。或者你需要一些像这样的中间值:

short val = '\1'; //for C 89
  printf("%d:%4hd\n",++i, val);
val =  '\2';
  printf("%d:%4d\n",++i,val);
......
or 
  printf("%d:%4hhd\n",++i,'\1'); //for c99 

要么不能正常工作!!!

于 2014-05-10T16:39:16.530 回答
0

后面的数字\被视为八进制。不过,我不知道为什么\8, \9,\19等序列如此奇怪。由于它们不是有效的八进制数,编译器可能可以自由地对它们做任何事情。

如果您愿意,可以以十六进制指定转义序列,如\x1,\x2等。

于 2012-05-06T14:02:08.903 回答