Ответ 1
Триграфы более проблематичны для незнакомого пользователя, чем орграфы. Это происходит потому, что они заменяются в строковых литералах и комментариях. Вот несколько примеров...
Пример A:
std::string example = "What??!??!";
std::cout << example << std::endl;
What||
будет напечатан на консоли. Это связано с тем, что триграф ??!
переводится на |
.
Пример B:
// Error ?!?!?!??!??/
std::cout << "There was an error!" << std::end;
Ничего не произойдет вообще. Это связано с тем, что ??/
переводится в \
, что ускользает от символа новой строки и приводит к прочтению следующей строки.
Пример C:
// This makes no sense ?!?!!?!??!??/
std::string example = "Hello World";
std::cout << example << std::endl;
Это даст ошибку вдоль строк use of undeclared identifier "example"
по тем же причинам, что и в примере B.
Есть еще более сложные проблемы, которые могут вызвать триграфы, но вы получаете идею. Следует отметить, что многие составители действительно выдают предупреждение, когда такие переводы делаются; еще одна причина всегда относиться к предупреждениям как к ошибкам. Однако это не требуется стандартом и, следовательно, нельзя полагаться.
Диграфы гораздо менее проблематичны, чем триграфы, так как они не заменяются внутри другого токена (т.е. строки или символьного литерала), и нет последовательности, которая преобразуется в \
, поэтому экранирование новых строк в комментариях не может быть.
Заключение
Помимо более трудного для чтения кода, меньше проблем, вызванных орграфами, и поэтому необходимость их удаления значительно уменьшается.