名前空間
変種
操作

演算子の代替表現

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (非推奨)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
一般
値カテゴリ (lvalue, rvalue, xvalue)
評価順序 (副作用完了点)
定数式
未評価式
一次式
ラムダ式(C++11)
リテラル
整数リテラル
浮動小数点リテラル
ブーリアンリテラル
文字リテラル および エスケープシーケンス
文字列リテラル
ヌルポインタリテラル(C++11)
ユーザ定義リテラル(C++11)
演算子
代入演算子: a=b, a+=b, a-=b, a*=b, a/=b, a%=b, a&=b, a|=b, a^=b, a<<=b, a>>=b
インクリメントとデクリメント: ++a, --a, a++, a--
算術演算子: +a, -a, a+b, a-b, a*b, a/b, a%b, ~a, a&b, a|b, a^b, a<<b, a>>b
論理演算子: a||b, a&&b, !a
比較演算子: a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
メンバアクセス演算子: a[b], *a, &a, a->b, a.b, a->*b, a.*b
その他の演算子: a(...), a,b, a?b:c
デフォルト比較(C++20)
演算子の代替表現
優先順位と結合性
畳み込み式(C++17)
new 式
delete 式
throw 式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
演算子オーバーロード
変換
暗黙の変換
const_cast
static_cast
reinterpret_cast
dynamic_cast
明示的な変換 (T)a, T(a)
ユーザ定義変換
 

C++ (および C) のソースコードは ISO 646:1983 の共通文字集合を含む任意の非 ASCII 7 ビット文字で書くことができます。 しかし、いくつかの C++ の演算子および記号は ISO 646 の符号化集合の範囲外の文字 ({, }, [, ], #, \, ^, |, ~) を必要とします。 これらの記号の一部または全部が存在しない文字エンコーディング (ドイツ語の DIN 66003 など) を使用可能とするために、 C++ は ISO 646 互換の文字を組み合わせた以下の代替表現を定義しています。

目次

[編集] 代替トークン

非 ISO 646 文字を使用するいくつかの演算子およびその他のトークンに対する代替表現があります。 各代替トークンは、言語のあらゆる点において、その綴りを除き、その主トークンとまったく同じ動作をします (文字列化演算子はその綴りを可視化できます)。 2文字の代替トークンは「ダイグラフ」と呼ばれることもあります。

主トークン 代替トークン
&& and
&= and_eq
& bitand
| bitor
~ compl
! not
!= not_eq
|| or
|= or_eq
^ xor
^= xor_eq
{ <%
} %>
[ <:
] :>
# %:
## %:%:

パーサが文字シーケンス <:: に遭遇し、後続の文字が : でも > でもないとき、 < はそれ自身によって処理されるトークンとして扱われ、代替トークン <: の最初の文字としては扱われません。 そのため std::vector<::std::string>std::vector[:std::string> と間違って扱われることはありません。

(C++11およびそれ以降)

[編集] ノート

文字 & および ! は ISO 646 の共通部分ですが、さらに制限の厳しい歴史的な文字集合に適合するために、これらの文字を使用する演算子に対しても代替表現が提供されます。

文字 = はサポートされているすべての文字集合に存在していたため、等価演算子 == のための代替表現 (eq みたいな) はありません。

[編集] C との互換性

同じ単語が C プログラミング言語ではインクルードファイル <iso646.h> でマクロとして定義されています。 C++ ではこれらは言語に組み込まれているため、 C++ 版の <iso646.h> および <ciso646> は何も定義しません。

[編集] トライグラフ (C++17で削除)

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

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

トライグラフは早期に処理されるため、 // Will the next line be executed?????/ のようなコメントは実質的に後続の行をコメントアウトし、 "Enter date ??/??/??" のような文字列リテラルは "Enter date \\??" として解析されます。

[編集] キーワード

and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq

[編集]

以下の例はいくつかの代替トークンの使用方法をデモンストレーションします。

%:include <iostream>
 
struct X
<%
    compl X() <%%> // デストラクタ
    X() <%%>
    X(const X bitand) = delete; // コピーコンストラクタ
 
    bool operator not_eq(const X bitand other)
    <%
       return this not_eq bitand other;
    %>
%>;
 
int main(int argc, char* argv<::>) 
<%
    // 参照キャプチャ付きのラムダ
    auto greet = <:bitand:>(const char* name)
    <%
        std::cout << "Hello " << name
                  << " from " << argv<:0:> << '\n';
    %>;
 
    if (argc > 1 and argv<:1:> not_eq nullptr) <%
        greet(argv<:1:>);
    %>
%>


[編集] 関連項目

代替演算子およびトークンC言語リファレンス