2012-05-06 3 views
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

+1

Компилятор - ваш друг. Всегда включайте все предупреждения. Mine говорит: «предупреждение: неизвестная escape-последовательность:« \ 8 »[включена по умолчанию]», «предупреждение: многосимвольная символьная константа [-Wmultichar]». –

+0

Если я правильно помню, \ n эквивалентно восьмеричному значению ASCII n. Поэтому \ 8 является незаконным. –

+0

[ссылка] http://codepad.org/I1N6A71j –

ответ

1

От 2.14.3:

побег \ooo состоит из обратной косой черты следует один , две или три восьмеричные цифры, которые берутся для указания значения желаемого символа. Побег \xhhh состоит из обратного слэша, за которым следует x, за которым следует одна или несколько шестнадцатеричных цифр, которые берутся для указания значения желаемого символа. Число в шестнадцатеричной последовательности не ограничено. Последовательность восьмеричных или шестнадцатеричных цифр заканчивается первым символом, который не является восьмеричной цифрой или шестнадцатеричной цифрой, соответственно.

С \8 и \18 не являются допустимыми последовательности значения в восьмиричном, смысл этих литералов зависит от вашей платформы:

Escape-последовательности, в которой символ после обратной косой черты не перечисленных в таблице 7, условно -поддержан, с семантикой, определенной реализацией.

+0

- это те одинарные кавычки, которые разрешены в инструкции printf, которые никогда не видели их, вы можете предоставить мне ссылку, где я могу прочитать о ней, как это возможно –

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. Вы также можете легко обнаружить это, если у вас есть достойный редактор. Мои ViM отмечают \8 и \9 в красном, потому что они недействительны.

+1

Нет необходимости/не нужно использовать для трансляции. Символьные литералы имеют тип 'int'. И даже ** если ** у них был тип 'char' (чего у них нет), все вариативные аргументы подлежат дефолтным акциям и, таким образом, получают повышение до' int'. –

+0

@R .., ты прав, мой плохой. – Shahbaz

2

Предполагается, что последовательности эвакуации должны быть восьмеричными, поэтому \ 8 и \ 9 не допускаются и приводят к неуказанному поведению. Результат зависит от используемого вами компилятора; в этом случае он игнорирует escape и обработку «8» и «9» как простой ascii-char.

Чтобы получить правильный результат (ascii-char), вы должны использовать \ x8 и \ x9.

0

Число после \ рассматривается как восьмеричное. Я не знаю, почему \8, \9, \19 и т. Д. Последовательности настолько странные. Поскольку они не являются действительными восьмеричными числами, компилятор, вероятно, свободен делать с ними что-либо.

Escape-последовательности могут быть указаны в шестнадцатеричном, если вы предпочитаете, как и \x1, \x2 и т.д.

0

Использовать hh до того, как требуется модификатор формата d !!! Таким образом, вы используете формат 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 

Либо не работать правильно !!!