Alternative operators and tokens
Исходный код на языке C может быть написан с использованием любого 8-битного набора символов, включающего
ISO 646:1983
инвариантный набор символов, даже не-ASCII кодировок. Однако некоторые операторы и пунктуаторы C требуют символов, выходящих за пределы кодового набора ISO 646:
{, }, [, ], #, \, ^, |, ~
. Для возможности использования кодировок, в которых некоторые или все эти символы отсутствуют (например, немецкая
DIN 66003
), существует две возможности: альтернативные варианты написания операторов с использованием этих символов или специальные комбинации двух или трёх совместимых с ISO 646 символов, которые интерпретируются как один не-ISO 646 символ.
Содержание |
Макросы операторов (C95)
Существуют альтернативные написания операторов, использующие не-ISO646 символы, определённые в <iso646.h> как макросы:
|
Определено в заголовке
<iso646.h>
|
|
| Основной | Альтернативный |
&&
|
and
(макрос оператора) |
&=
|
and_eq
(макрос оператора) |
&
|
bitand
(макрос оператора) |
|
|
bitor
(макрос оператора) |
~
|
compl
(макрос оператора) |
!
|
not
(макрос оператора) |
!=
|
not_eq
(макрос оператора) |
||
|
or
(макрос оператора) |
|=
|
or_eq
(макрос оператора) |
^
|
xor
(макрос оператора) |
^=
|
xor_eq
(макрос оператора) |
Символы & и ! являются инвариантными в ISO-646, но альтернативы предоставляются для операторов, использующих эти символы, чтобы обеспечить совместимость с ещё более ограниченными историческими наборами символов.
Для оператора равенства == не существует альтернативного написания (такого как eq ), поскольку символ = присутствовал во всех поддерживаемых наборах символов.
Альтернативные токены (C95)
Следующие альтернативные токены являются частью основного языка, и во всех аспектах языка каждый альтернативный токен ведет себя точно так же, как и его основной токен, за исключением написания ( оператор строкификации может сделать написание видимым). Двухбуквенные альтернативные токены иногда называются "диграфами" (даже несмотря на то, что % : % : также считается диграфом).
| Основной | Альтернативный |
|---|---|
{
|
<%
|
}
|
%>
|
[
|
<:
|
]
|
:>
|
#
|
%:
|
##
|
%:%:
|
Триграфы (удалены в C23)
Следующие трёхсимвольные группы (триграфы) обрабатываются до распознавания комментариев и строковых литералов , и каждое появление триграфа заменяется соответствующим основным символом:
| Основной | Триграф |
|---|---|
{
|
??<
|
}
|
??>
|
[
|
??(
|
]
|
??)
|
#
|
??=
|
\
|
??/
|
^
|
??'
|
|
|
??!
|
~
|
??-
|
Поскольку триграфы обрабатываются на раннем этапе, комментарий вида // Will the next line be executed?????/ фактически закомментирует следующую строку, а строковый литерал вида "What's going on??!" будет разобран как "What's going on|" .
Пример
Демонстрирует альтернативные написания операторов из <iso646.h> а также использование диграфов и триграфов. Если аргументы командной строки содержат пробелы, их следует заключать в кавычки, например, "Third World!" .
Возможный вывод:
Hello ./a.out
Смотрите также
|
Документация C++
для
Альтернативных представлений операторов
|