優先順位の高い順に並べると、下表のようになります。
| 演算子 | 名称と意味 | 結合規則 | C++固有 |
|---|---|---|---|
| :: | スコープ解決 | なし | ○ |
| :: | グローバル | なし | ○ |
| [ ] | 配列の添字付け | 左→右 | |
| ( ) | 関数の呼び出し | 左→右 | |
| ( ) | 変換 | なし | |
| . | メンバ選択 (オブジェクト) | 左→右 | |
| -> | メンバ選択 (ポインタ) | 左→右 | |
| ++ | 後置インクリメント | なし | |
| -- | 後置デクリメント | なし | |
| new | 動的なメモリ割り当て | なし | ○ |
| delete | 動的に割り当てたメモリ領域の解放 | なし | ○ |
| new[ ] | 動的な配列の割り当て | なし | ○ |
| delete[ ] | 動的に割り当てた配列領域の解放 | なし | ○ |
| ++ | 前置インクリメント | なし | |
| -- | 前置デクリメント | なし | |
| * | 間接演算子 (参照) | なし | |
| & | アドレス演算子 | なし | |
| + | 正符号 | なし | |
| - | 負符号 | なし | |
| ! | 論理NOT | なし | |
| ~ | ビットごとの補数 | なし | |
| sizeof | sizeof演算子 | なし | |
| typeid( ) | 型名 | なし | ○ |
| (type) | cast演算子 (型キャスト) | 左←右 | |
| const_cast | const、volatile属性を変更するキャスト | なし | ○ |
| dynamic_cast | ポリモーフィックな型の安全な型キャスト | なし | ○ |
| reinterpret_cast | ビット構成の解釈を変更するキャスト | なし | ○ |
| static_cast | 非ポリモーフィックな型の標準変換を行うキャスト | なし | ○ |
| .* | メンバオブジェクトへのポインタ | 左→右 | ○ |
| ->* | ポインタオブジェクトへのポインタ | 左→右 | ○ |
| * | 乗算 | 左→右 | |
| / | 除算 | 左→右 | |
| % | 剰余 | 左→右 | |
| + | 加算 | 左→右 | |
| - | 減算 | 左→右 | |
| << | 左シフト | 左→右 | |
| >> | 右シフト | 左→右 | |
| < | 小なり | 左→右 | |
| > | 大なり | 左→右 | |
| <= | 以下 | 左→右 | |
| >= | 以上 | 左→右 | |
| == | 等価 | 左→右 | |
| != | 不等価 | 左→右 | |
| & | ビットごとの AND | 左→右 | |
| ^ | ビットごとの 排他的OR | 左→右 | |
| | | ビットごとの OR | 左→右 | |
| && | 論理 AND | 左→右 | |
| || | 論理 OR | 左→右 | |
| e1? e2: e3 | 条件 | 左←右 | |
| = | 代入演算子 | 左←右 | |
| *= | 乗算代入 | 左←右 | |
| /= | 除算代入 | 左←右 | |
| %= | 剰余代入 | 左←右 | |
| += | 加算代入 | 左←右 | |
| -= | 減算代入 | 左←右 | |
| <<= | 左シフト代入 | 左←右 | |
| >>= | 右シフト代入 | 左←右 | |
| &= | ビットごとの AND代入 | 左←右 | |
| |= | ビットごとの OR代入 | 左←右 | |
| ^= | ビットごとの 排他的OR代入 | 左←右 | |
| , | カンマ (式と式の区切りなど) | 左→右 |
演算子の優先順位 (PDF形式)
int iZero = 0; double dZero = 0.0; int ri1 = 1 / iZero; // 0xC0000094: Integer division by zero。 double ri2 = 1.0 / iZero; // inf double ri3 = 1 / dZero; // inf double ri4 = 1.0 / dZero; // inf int rz1 = 0 / iZero; // 0xC0000094: Integer division by zero。 double rz2 = 0.0 / iZero; // -nan(ind) double rz3 = 0 / dZero; // -nan(ind) double rz4 = 0.0 / dZero; // -nan(ind)
#include <bitset> #include <iostream>
unsigned char a0 = 0x03 & 0x06;
unsigned char a1 = 0x03 | 0x06;
unsigned char a2 = 0x03 ^ 0x06;
unsigned char a3 = ~0x06;
std::bitset<8> bit0{ a0 };
std::bitset<8> bit1{ a1 };
std::bitset<8> bit2{ a2 };
std::bitset<8> bit3{ a3 };
std::cout << bit0 << std::endl; // 00000010
std::cout << bit1 << std::endl; // 00000111
std::cout << bit2 << std::endl; // 00000101
std::cout << bit3 << std::endl; // 11111001
| 方向 | 空いたビット | |
|---|---|---|
| << (左シフト) | 指定されたビット数だけ、左にシフト | 符号ビットを含めてシフトし、あふれたビットは捨て、空いたビットはゼロで埋められる。符号付き数値をシフトして、符号ビットが影響受ける場合の結果は未定義 |
| >> (右シフト) | 指定されたビット数だけ、右にシフト |
|
signed char a0 = -96;
signed char a1 = a0 << 1;
signed char a2 = a0 << 2;
std::bitset<8> bit0{ (unsigned char)a0 };
std::bitset<8> bit1{ (unsigned char)a1 };
std::bitset<8> bit2{ (unsigned char)a2 };
std::cout << bit0 << std::endl; // 10100000
std::cout << bit1 << std::endl; // 01000000
std::cout << bit2 << std::endl; // 10000000
unsigned char a0 = 1;
unsigned char a1 = a0 >> 1;
unsigned char a2 = a0 >> 2;
std::bitset<8> bit0{ a0 };
std::bitset<8> bit1{ a1 };
std::bitset<8> bit2{ a2 };
std::cout << bit0 << std::endl; // 00000001
std::cout << bit1 << std::endl; // 00000000
std::cout << bit2 << std::endl; // 00000000
signed char a0 = -2;
signed char a1 = a0 >> 1;
signed char a2 = a0 >> 2;
std::bitset<8> bit0{ (unsigned char)a0 };
std::bitset<8> bit1{ (unsigned char)a1 };
std::bitset<8> bit2{ (unsigned char)a2 };
std::cout << bit0 << std::endl; // 11111110
std::cout << bit1 << std::endl; // 11111111
std::cout << bit2 << std::endl; // 11111111