C++ 演算子

演算子は、コンパイラに特定の数学的または論理的操作を実行するように指示する記号です。C++ には豊富な演算子が組み込まれており、次の種類の演算子が用意されています:

  • 算術演算子
  • 関係演算子
  • 論理演算子
  • ビット演算子
  • 代入演算子
  • その他の演算子

この章では、算術演算子、関係演算子、論理演算子、ビット演算子、代入演算子、およびその他の演算子について順に説明します。

算術演算子

以下の表は、C++ がサポートする算術演算子を示しています。

変数 A の値が 10、変数 B の値が 20 であると仮定すると、次のようになります:

演算子説明例
+2つのオペランドを加算しますA + B は 30 になります
-最初のオペランドから2番目のオペランドを減算しますA - B は -10 になります
*2つのオペランドを乗算しますA * B は 200 になります
/分子を分母で除算しますB / A は 2 になります
%剰余演算子。除算後の余りを求めますB % A は 0 になります
++インクリメント演算子、整数値を 1 増やしますA++ は 11 になります
--デクリメント演算子、整数値を 1 減らしますA-- は 9 になります

例

次の例を参照して、C++ で使用できる算術演算子を理解してください。

次の C++ プログラムをコピーして test.cpp ファイルに貼り付け、プログラムをコンパイルして実行してください。

例

#include <iostream> using namespace std; int main() { int a = 21; int b = 10; int c; c = a + b; cout << "Line 1 - c の値は" << c << endl ; c = a - b; cout << "Line 2 - c の値は" << c << endl ; c = a * b; cout << "Line 3 - c の値は" << c << endl ; c = a / b; cout << "Line 4 - c の値は" << c << endl ; c = a % b; cout << "Line 5 - c の値は" << c << endl ; int d = 10; // インクリメントとデクリメントのテスト c = d++; cout << "Line 6 - c の値は" << c << endl ; d = 10; // 再代入 c = d--; cout << "Line 7 - c の値は" << c << endl ; return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が生成されます:

Line 1 - c 的值是 31
Line 2 - c 的值是 11
Line 3 - c 的值是 210
Line 4 - c 的值是 2
Line 5 - c 的值是 1
Line 6 - c 的值是 10
Line 7 - c 的值是 10

関係演算子

以下の表は、C++ がサポートする関係演算子を示しています。

変数 A の値が 10、変数 B の値が 20 であると仮定すると、次のようになります:

演算子説明例
==2つのオペランドの値が等しいかどうかを確認します。等しい場合は条件が真になります。(A == B) は真ではありません。
!=2つのオペランドの値が等しいかどうかを確認します。等しくない場合は条件が真になります。(A != B) は真です。
>左オペランドの値が右オペランドの値より大きいかどうかを確認します。大きい場合は条件が真になります。(A > B) は真ではありません。
<左オペランドの値が右オペランドの値より小さいかどうかを確認します。小さい場合は条件が真になります。(A < B) は真です。
>=左オペランドの値が右オペランドの値以上かどうかを確認します。そうであれば条件が真になります。(A >= B) は真ではありません。
<=左オペランドの値が右オペランドの値以下かどうかを確認します。そうであれば条件が真になります。(A <= B) は真です。

例

次の例を参照して、C++ で使用できる関係演算子を理解してください。

次の C++ プログラムをコピーして test.cpp ファイルに貼り付け、プログラムをコンパイルして実行してください。

例

#include <iostream> using namespace std; int main() { int a = 21; int b = 10; int c ; if( a == b ) { cout << "Line 1 - a は b と等しい" << endl ; } else { cout << "Line 1 - a は b と等しくない" << endl ; } if ( a < b ) { cout << "Line 2 - a は b より小さい" << endl ; } else { cout << "Line 2 - a は b より小さくない" << endl ; } if ( a > b ) { cout << "Line 3 - a は b より大きい" << endl ; } else { cout << "Line 3 - a は b より大きくない" << endl ; } /*a と b の値を変更*/ a = 5; b = 20; if ( a <= b ) { cout << "Line 4 - a は b 以下" << endl ; } if ( b >= a ) { cout << "Line 5 - b は a 以上" << endl ; } return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が生成されます:

Line 1 - a 不等于 b
Line 2 - a 不小于 b
Line 3 - a 大于 b
Line 4 - a 小于或等于 b
Line 5 - b 大于或等于 a

論理演算子

以下の表は、C++ がサポートする関係論理演算子を示しています。

変数 A の値が 1、変数 B の値が 0 であると仮定すると、次のようになります:

演算子説明例
&&論理積演算子と呼ばれます。両方のオペランドが true の場合、条件は true になります。(A && B) は false です。
||論理和演算子と呼ばれます。いずれかのオペランドが true の場合、条件は true になります。(A || B) は true です。
!論理否定演算子と呼ばれます。オペランドの論理状態を反転させるために使用され、条件が true の場合、論理否定演算子はそれを false にします。!(A && B) は true です。

例

次の例を参照して、C++ で使用できる論理演算子を理解してください。

次の C++ プログラムをコピーして test.cpp ファイルに貼り付け、プログラムをコンパイルして実行してください。

例

#include <iostream> using namespace std; int main() { int a = 5; int b = 20; int c ; if ( a && b ) { cout << "Line 1 - 条件は真です"<< endl ; } if ( a || b ) { cout << "Line 2 - 条件は真です"<< endl ; } /*a と b の値を変更*/ a = 0; b = 10; if ( a && b ) { cout << "Line 3 - 条件は真です"<< endl ; } else { cout << "Line 4 - 条件は真ではありません"<< endl ; } if ( !(a && b) ) { cout << "Line 5 - 条件は真です"<< endl ; } return 0; }

上記のコードがコンパイルおよび実行されると、次の結果が生成されます:

Line 1 - 条件为真
Line 2 - 条件为真
Line 4 - 条件不为真
Line 5 - 条件为真

ビット演算子

ビット演算子はビットに対して作用し、ビット単位で操作を実行します。&、|、^ の真理値表は次のとおりです:

pqp & qp | qp ^ q
00000
01011
11110
10011

A = 60、B = 13 と仮定すると、2進数形式で表した場合、それらは次のようになります:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

以下の表は、C++ がサポートするビット演算子を示しています。変数 A の値が 60、変数 B の値が 13 であると仮定すると、次のようになります:

演算子説明例
&

ビット単位の AND 演算。2進数の各ビットに対して AND 演算を行います。演算規則:

0&0=0;   
0&1=0;    
1&0=0;     
1&1=1;
(A & B) は 12、すなわち 0000 1100 になります
|

ビット単位の OR 演算子。2進数の各ビットに対して OR 演算を行います。演算規則:

0|0=0;   
0|1=1;   
1|0=1;    
1|1=1;
(A | B) は 61、すなわち 0011 1101 になります
^

排他的論理和(XOR)演算子。2進数の各ビットに対して XOR 演算を行います。演算規則:

0^0=0;   
0^1=1;   
1^0=1;  
1^1=0;
(A ^ B) は 49、すなわち 0011 0001 になります
~

否定(NOT)演算子。2進数の各ビットに対して NOT 演算を行います。演算規則:

~1=-2;   
~0=-1;
(~A) は -61、すなわち 1100 0011 になります。これは符号付き2進数の2の補数形式です。
<<2進数の左シフト演算子。オペランドの各2進ビットを左に指定した桁数だけシフトします(左のビットは捨てられ、右には 0 が補充されます)。A << 2 は 240、すなわち 1111 0000 になります
>>2進数の右シフト演算子。数値の各2進ビットを右に指定した桁数だけシフトします。正の数は左に 0 を補充し、負の数は左に 1 を補充し、右側は捨てられます。A >> 2 は 15、すなわち 0000 1111 になります

例

次の例を参照して、C++ で使用できるビット演算子を理解してください。

次の C++ プログラムをコピーして test.cpp ファイルに貼り付け、プログラムをコンパイルして実行してください。

例

#include <iostream> using namespace std; int main() { unsigned int a = 60; // 60 = 0011 1100 unsigned int b = 13; // 13 = 0000 1101 int c = 0; c = a & b; // 12 = 0000 1100 cout << "Line 1 - c の値は" << c << endl ; c = a | b; // 61 = 0011 1101 cout << "Line 2 - c の値は" << c << endl ; c = a ^ b; // 49 = 0011 0001 cout << "Line 3 - c の値は" << c << endl ; c = ~a; // -61 = 1100 0011 cout << "Line 4 - c の値は" << c << endl ; c = a << 2; // 240 = 1111 0000 cout << "Line 5 - c の値は" << c << endl ; c = a >> 2; // 15 = 0000 1111 cout << "Line 6 - c の値は" << c << endl ; return 0; }

上記のコードをコンパイルして実行すると、次の結果が生成されます。

Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15

代入演算子

次の表は、C++ でサポートされている代入演算子の一覧です。

演算子説明例
=単純代入演算子。右オペランドの値を左オペランドに代入します。C = A + B は A + B の値を C に代入します。
+=加算代入演算子。右オペランドを左オペランドに加算した結果を左オペランドに代入します。C += A は C = C + A と同等です。
-=減算代入演算子。左オペランドから右オペランドを減算した結果を左オペランドに代入します。C -= A は C = C - A と同等です。
*=乗算代入演算子。右オペランドを左オペランドに乗算した結果を左オペランドに代入します。C *= A は C = C * A と同等です。
/=除算代入演算子。左オペランドを右オペランドで除算した結果を左オペランドに代入します。C /= A は C = C / A と同等です。
%=剰余代入演算子。2つのオペランドの剰余を求め、左オペランドに代入します。C %= A は C = C % A と同等です。
<<=左シフト代入演算子C <<= 2 は C = C << 2 と同等です。
>>=右シフト代入演算子C >>= 2 は C = C >> 2 と同等です。
&=ビット論理積(AND)代入演算子C &= 2 は C = C & 2 と同等です。
^=ビット排他的論理和(XOR)代入演算子C ^= 2 は C = C ^ 2 と同等です。
|=ビット論理和(OR)代入演算子C |= 2 は C = C | 2 と同等です。

例

C++ で使用できる代入演算子を理解するには、次の例を参照してください。

次の C++ プログラムをコピーして test.cpp ファイルに貼り付け、プログラムをコンパイルして実行してください。

例

#include <iostream> using namespace std; int main() { int a = 21; int c ; c = a; cout << "Line 1 - = 演算子の例、c の値 = :" <<c<< endl ; c += a; cout << "Line 2 - += 演算子の例、c の値 = :" <<c<< endl ; c -= a; cout << "Line 3 - -= 演算子の例、c の値 = :" <<c<< endl ; c *= a; cout << "Line 4 - *= 演算子の例、c の値 = :" <<c<< endl ; c /= a; cout << "Line 5 - /= 演算子の例、c の値 = :" <<c<< endl ; c = 200; c %= a; cout << "Line 6 - %= 演算子の例、c の値 = :" <<c<< endl ; c <<= 2; cout << "Line 7 - <<= 演算子の例、c の値 = :" <<c<< endl ; c >>= 2; cout << "Line 8 - >>= 演算子の例、c の値 = :" <<c<< endl ; c &= 2; cout << "Line 9 - &= 演算子の例、c の値 = :" <<c<< endl ; c ^= 2; cout << "Line 10 - ^= 演算子の例、c の値 = :" <<c<< endl ; c |= 2; cout << "Line 11 - |= 演算子の例、c の値 = :" <<c<< endl ; return 0; }

上記のコードをコンパイルして実行すると、次の結果が生成されます。

Line 1 - =  运算符实例,c 的值 = 21
Line 2 - += 运算符实例,c 的值 = 42
Line 3 - -= 运算符实例,c 的值 = 21
Line 4 - *= 运算符实例,c 的值 = 441
Line 5 - /= 运算符实例,c 的值 = 21
Line 6 - %= 运算符实例,c 的值 = 11
Line 7 - <<= 运算符实例,c 的值 = 44
Line 8 - >>= 运算符实例,c 的值 = 11
Line 9 - &= 运算符实例,c 的值 = 2
Line 10 - ^= 运算符实例,c 的值 = 0
Line 11 - |= 运算符实例,c 的值 = 2

その他の演算子

次の表は、C++ でサポートされているその他の重要な演算子の一覧です。

演算子説明
sizeofsizeof 演算子変数のサイズを返します。例えば、sizeof(a) は、a が整数の場合、4 を返します。
Condition ? X : Y条件演算子Condition が真の場合 ? 値は X : それ以外の場合 値は Y。
,コンマ演算子一連の演算を順番に実行します。コンマ式全体の値は、コンマで区切られたリストの最後の式の値です。
.(ドット)と ->(アロー)メンバ演算子クラス、構造体、共用体のメンバを参照するために使用します。
Castキャスト演算子あるデータ型を別のデータ型に変換します。例えば、int(2.2000) は 2 を返します。
&ポインタ演算子 &変数のアドレスを返します。例えば &a; は変数の実際のアドレスを示します。
*ポインタ演算子 *変数を指し示します。例えば、*var; は変数 var を指します。

C++ における演算子の優先順位

演算子の優先順位は、式内の項の組み合わせを決定します。これは、式がどのように評価されるかに影響します。一部の演算子は他の演算子よりも優先順位が高くなります。例えば、乗算・除算演算子は加算・減算演算子よりも優先順位が高くなります。

例えば x = 7 + 3 * 2 の場合、演算子 * は + よりも優先順位が高いため、最初に乗算 3*2 が計算され、その結果に 7 が加算されるので、x には 20 ではなく 13 が代入されます。

次の表は、演算子の優先順位が高いものから低いものの順に各演算子を示しています。優先順位が高い演算子は表の上部に、優先順位が低い演算子は表の下部に表示されます。式の中では、優先順位が高い演算子が先に評価されます。

カテゴリ 演算子結合性
後置() [] -> . ++ - -   左から右
単項 + - ! ~ ++ - - (type)* & sizeof  右から左
乗算/除算 * / % 左から右
加算/減算+ -  左から右
シフト << >>  左から右
関係< <= > >=  左から右
等価 == !=  左から右
ビット論理積 AND&  左から右
ビット排他的論理和 XOR ^  左から右
ビット論理和 OR |  左から右
論理積 AND&&  左から右
論理和 OR ||  左から右
条件?:  右から左
代入 = += -= *= /= %=>>= <<= &= ^= |= 右から左
コンマ ,  左から右

例

C++ での演算子の優先順位を理解するには、次の例を参照してください。

次の C++ プログラムをコピーして test.cpp ファイルに貼り付け、プログラムをコンパイルして実行してください。

括弧がある場合とない場合の違いを比較してください。これにより、異なる結果が生じます。()、/、*、+ は優先順位が異なるため、優先順位の高い演算子が先に計算されます。

例

#include <iostream> using namespace std; int main() { int a = 20; int b = 10; int c = 15; int d = 5; int e; e = (a + b) * c / d; // ( 30 * 15 ) / 5 cout << "(a + b) * c / d の値は" << e << endl ; e = ((a + b) * c) / d; // (30 * 15 ) / 5 cout << "((a + b) * c) / d の値は" << e << endl ; e = (a + b) * (c / d); // (30) * (15/5) cout << "(a + b) * (c / d) の値は" << e << endl ; e = a + (b * c) / d; // 20 + (150/5) cout << "a + (b * c) / d の値は" << e << endl ; return 0; }

上記のコードをコンパイルして実行すると、次の結果が生成されます。

(a + b) * c / d 的值是 90
((a + b) * c) / d 的值是 90
(a + b) * (c / d) 的值是 90
a + (b * c) / d 的值是 50
その他の拡張