Распечатать ??а также !!в разной последовательности покажет разный вывод - PullRequest
5 голосов
/ 05 октября 2010

Я нашел странный вывод, когда очень просто написал следующие строки:

Код:

 printf("LOL??!\n");
 printf("LOL!!?\n");

Выход: alt text

Бывает, что даже код скомпилирован под MBCS и UNICODE.

Вывод зависит от последовательности "?" и "!" ...

Есть идеи?

Ответы [ 5 ]

16 голосов
/ 05 октября 2010

??! - это триграф , который заменяется на |.

Как правило, вам никогда не следует помещать два знака вопроса в любом месте исходного файла.

5 голосов
/ 06 октября 2010

Вы можете попробовать

printf( "What?\?!\n" );

В компьютерном программировании орграфы и триграфы представляют собой последовательности из двух и трех символов соответственно, которые интерпретируются языком программирования как один символ.

Некоторые компиляторы поддерживают опцию выключения распознавания триграфов или по умолчанию отключают триграфы и требуют опции для их включения.Некоторые могут выдавать предупреждения, когда они встречают триграфы в исходных файлах.Borland предоставил отдельную программу, препроцессор триграфа, которая будет использоваться только тогда, когда требуется обработка триграфа.

5 голосов
/ 05 октября 2010

Они называются Последовательности триграфа

??! - последовательность триграфа для вертикальной черты |.

Препроцессор C / C ++ распознает триграфы и заменяет их эквивалентными символами.
Таким образом, к тому времени, когда ваш код будет виден компилятором, триграфы уже заменены.

# grepping in the source file:
$ grep printf a.c      
  printf("foo: ??!");

# grepping the preprocessor output:
$ gcc a.c -trigraphs -E | grep printf | grep foo
  printf("foo: |");
4 голосов
/ 05 октября 2010

??! известен как триграф и заменяется на | на выходе. Проверьте эту ссылку

2 голосов
/ 05 октября 2010

Это специальная последовательность символов в строковой константе, которая имеет особое значение.Названные триграфом, они были изначально реализованы, потому что не все терминалы поддерживали некоторые символы.

...