'??' превращается в '^' в Visual C ++. Почему это происходит и каков выход? - PullRequest
2 голосов
/ 15 апреля 2010

'??' преобразуется в '^', если я скомпилирую программу mn VC ++ и запускаю ее

например.

sprintf( ch, "??") 

распечатывает

^

Но если я запускаю тот же код в Turbo C / C ++, такой проблемы не возникает. Почему это происходит на VC ++ в Windows?

Ответы [ 3 ]

4 голосов
/ 15 апреля 2010

Вы уверены, что это была двойная, а не одинарная кавычка? Если это было ?? ', то вы только что столкнулись с триграфом , который является «функцией», которую действительно нужно удалить , но это не из-за того, что IBM не переходит на UTF-8 из EBCDIC . (Триграфы рассматривались для удаления, когда C ++ 0x все еще был открыт для изменений, но ход удаления триграфов был сильно заблокирован IBM и ее представителями в комитете ISO C ++).

4 голосов
/ 15 апреля 2010

?? само по себе не является триграфом , хотя ??' соответствует ^.

Возможно, вы ввели его здесь не так, как в коде, и вы не можете увидеть заключительную одинарную кавычку в вашей строке, потому что она слишком близка к закрывающей кавычке.

Итак, в коде у вас, вероятно, есть:

sprintf( ch, "??'");
3 голосов
/ 15 апреля 2010

Обычно последовательность ?? запускает триграф, но последовательность "??" не триграф, поэтому его не следует интерпретировать как таковой - может быть, есть ошибка в компиляторе - какую именно версию вы используете и какой код (включая объявления переменных)?

Этот код печатает "??" в нескольких версиях MSVC 6 до VS 2010, как и следовало ожидать:

char ch[20];
sprintf( ch, "??");
printf( "%s\n", ch);

Но замените строку snprintf() на:

sprintf( ch, "'??'");

и вывод становится "'^" (кроме VS 2010).

Быстрый тест показывает, что VS 2010 по умолчанию отключает поддержку триграфа (во 2-м тесте выводится «'??'»). В VS 2010 вы должны явно включить поддержку триграфа, используя опцию /Zc:trigraphs. Ницца.

Подробнее о том, что такое триграфы, см .: Назначение последовательностей триграфов в C ++?

...