名前空間
変種
操作

代替演算子とトークン

From cppreference.com
< c‎ | language

Cソースコードは、ASCII以外のものも含め、ISO 646:1983の不変文字セットを含む任意の8ビット文字セットで記述できます。しかし、いくつかのC演算子と区切り文字は、ISO 646コードセット外の文字を必要とします: {, }, [, ], #, \, ^, |, ~。これらの記号の一部またはすべてが存在しない文字エンコーディング(ドイツのDIN 66003など)を使用できるようにするために、2つの可能性があります。これらの文字を使用する演算子の代替スペル、または単一の非ISO 646文字であるかのように解釈される2つまたは3つのISO 646互換文字の特殊な組み合わせです。

目次

[編集] 演算子マクロ (C95)

ISO646以外の文字を使用する演算子には、<iso646.h>でマクロとして定義された代替スペルがあります。

ヘッダー<iso646.h>で定義されています
プライマリ 代替 (Alternative)
&&
および
(演算子マクロ)
&=
and_eq
(演算子マクロ)
&
bitand
(演算子マクロ)
|
bitor
(演算子マクロ)
~
compl
(演算子マクロ)
!
not
(演算子マクロ)
!=
not_eq
(演算子マクロ)
||
or
(演算子マクロ)
|=
or_eq
(演算子マクロ)
^
xor
(演算子マクロ)
^=
xor_eq
(演算子マクロ)

文字&!はISO-646の下では不変ですが、より制限の厳しい歴史的な文字セットにも対応するため、これらの文字を使用する演算子にも代替が提供されています。

等価演算子==には、代替スペル(eqなど)がありません。これは、文字=がすべてのサポートされている文字セットに存在するためです。

[編集] 代替トークン (C95)

以下の代替トークンはコア言語の一部であり、言語のあらゆる面で、各代替トークンはスペルを除いてそのプライマリトークンとまったく同じように動作します(文字列化演算子はスペルを可視化できます)。2文字の代替トークンは「ダイグラフ」と呼ばれることもあります(4文字長%:%:もダイグラフと見なされますが)。


プライマリ 代替 (Alternative)
{ <%
} %>
[ <:
] :>
# %:
## %:%:

[編集] トライグラフ (C23で削除)

以下の3文字グループ(トライグラフ)は、コメントと文字列リテラルが認識される前に解析され、トライグラフの各出現は対応するプライマリ文字に置き換えられます。

プライマリ トライグラフ
{ ??<
} ??>
[ ??(
] ??)
# ??=
\ ??/
^ ??'
| ??!
~ ??-

トライグラフは早期に処理されるため、// 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++ドキュメント
English 日本語 中文(简体) 中文(繁體)