演算子

目次

演算子の優先順位

優先順位の高い順に並べると、下表のようになります。

演算子 名称と意味 結合規則 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形式)

/ 演算子 (除算演算子 : division operator)

ゼロ除算 (division by zero)

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)

ビット演算子 (bitwise operators)

#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

シフト演算子 (shift operator)

  方向 空いたビット
<< (左シフト) 指定されたビット数だけ、左にシフト 符号ビットを含めてシフトし、あふれたビットは捨て、空いたビットはゼロで埋められる。符号付き数値をシフトして、符号ビットが影響受ける場合の結果は未定義
>> (右シフト) 指定されたビット数だけ、右にシフト
  • 符号なし数値 … 空いたビットはゼロで埋められる
  • 符号付き数値 … 空いたビットは符号ビット (数値が正なら0、負なら1) で埋められる (これは実装依存であり、Visual C++以外では異なる可能性あり)
左シフト演算子および右シフト演算子 (<< および >>) | MSDN

<<演算子 (左シフト演算子)

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

参考

参考書

  • プログラミング言語C++ 第3版 [アジソン・ウェスレイ・パブリッシャーズ・ジャパン] Bjarne Stroustrup
    6章2「演算子の概要」、11章「演算子の多重定義」
Microsoft Learnから検索