Альтернативные операторы и токены
Код на языке C может быть написан в любом 8-битном наборе символов, включающем инвариантный набор символов ISO 646:1983, даже не ASCII. Однако несколько операторов и разделителей C требуют символов, которые находятся вне набора кодов ISO 646: {, }, [, ], #, \, ^, |, ~. Чтобы иметь возможность использовать кодировки символов, в которых некоторые или все эти символы отсутствуют (например, немецкий DIN 66003), существуют две возможности: альтернативные написания операторов, использующие эти символы, или специальные комбинации из двух или трёх символов, совместимых с ISO 646, которые интерпретируются как один символ, не совместимый с ISO 646.
Макросы операторов(C95)
Существуют альтернативные написания операторов, использующих символы, не совместимые с ISO 646, определённые в <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++ документация для Альтернативные представления операторов |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/operator_alternative