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進数であると想定されているため、\8および\9は許可されず、不特定の動作が発生します。結果は、使用しているコンパイラによって異なります。この場合、エスケープを無視し、「8」と「9」をプレーンなASCII文字として処理します。

適切な(ascii-char)結果を得るには、\x8と\x9を使用する必要があります。

于 2012-05-06T14:01:20.723 に答える
2

2.14.3から:

エスケープ\oooは、バックスラッシュとそれに続く1桁、2桁、または3桁の8進数で構成され、目的の文字の値を指定するために使用されます。エスケープ\xhhhは、バックスラッシュとそれにx続く1つ以上の16進数で構成され、目的の文字の値を指定するために使用されます。16進シーケンスの桁数に制限はありません。8進数または16進数のシーケンスは、それぞれ8進数または16進数ではない最初の文字で終了します。

\8およびは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では8進数です。適切なエディタがあれば、これを簡単に検出することもできます。私のViMマークは無効であるため、赤で表示されます\8\9

于 2012-05-06T14:00:25.997 に答える
0

後の数字は8進数\として扱われます。ただし、、、、などのシーケンスがなぜそれほど奇妙なのかはわかりません。それらは有効な8進数ではないため、コンパイラーはおそらくそれらを自由に使用できます。\8\9\19

\x1エスケープシーケンスは、必要に応じて、、などのように16進数で指定できます\x2

于 2012-05-06T14:02:08.903 に答える
0

フォーマットd修飾子が必要になる前にhhを使用してください!!! したがって、d形式を使用すると、int32値が想定されますが、使用するのはchar-8ビット値のみです!!! それはメモリ間違ったaccsssです!!! 利用可能な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 に答える