優先順位の高い順に並べると、下表のようになります。
演算子 | 名称と意味 | 結合規則 | 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