Namespaces
Variants

Alternative operators and tokens

From cppreference.net

Исходный код на языке 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!" .

%:include <stdio.h>
%:include <stdlib.h>
??=include <iso646.h>
int main(int argc, char** argv)
??<
    if (argc > 1 and argv<:1:> not_eq NULL)
    <%
       printf("Hello %s??/n", argv<:1:>);
    %>
    else
    <%
       printf("Hello %s??/n", argc? argv??(42??'42??) : __FILE__);
    %>
    return EXIT_SUCCESS;
??>

Возможный вывод:

Hello ./a.out

Смотрите также

Документация C++ для Альтернативных представлений операторов