На этот вопрос (о тесно связанных орграфах) есть ответ.
Это сводится к тому, что набор символов ISO 646 не имеет всех символов синтаксиса C, поэтому есть некоторые системы с клавиатурами и дисплеями, которые не могут работать с символами (хотя я думаю, что эти довольно редки в наше время).
В общем, вам не нужно их использовать, но вам нужно знать о них именно для той проблемы, с которой вы столкнулись. Триграфы являются причиной того, что символ '?
' имеет escape-последовательность:
'\?'
Итак, есть несколько способов избежать проблем с примером:
printf( "What?\?!\n" );
printf( "What?" "?!\n" );
Но вы должны помнить, когда вы печатаете два '?' символы, которые вы могли бы начать триграф (и это, безусловно, никогда не то, о чем я думаю).
На практике триграфы и орграфы - это то, о чем я не беспокоюсь изо дня в день. Но вы должны знать о них, потому что раз в пару лет вы столкнетесь с ошибкой, связанной с ними (и потратите остаток дня, ругая их существование). Было бы неплохо, если бы компиляторы могли быть настроены на предупреждение (или ошибку) при обнаружении триграфа или орграфа, чтобы я мог знать, что у меня есть кое-что, с чем я должен сознательно иметь дело.
И для полноты картины орграфы гораздо менее опасны, поскольку они обрабатываются как токены, поэтому орграф внутри строкового литерала не будет интерпретироваться как орграф.
Чтобы получить хорошее представление о различных забавах с пунктуацией в программах на C / C ++ (включая ошибку с триграфом, из-за которой я обязательно вырву свои волосы), взгляните на статью GOTW # 86 Херба Саттера .
Добавление:
Похоже, что GCC не будет обрабатывать (и будет предупреждать) триграфы по умолчанию. Некоторые другие компиляторы имеют опции для отключения поддержки триграфа (например, IBM). Microsoft начала поддерживать предупреждение (C4837) в VS2008, которое должно быть явно включено (используя -Wall или что-то).