C++ 演算子


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

  • 算術演算子

  • 関係演算子

  • 論理演算子

  • ビット演算子

  • 代入演算子

  • その他演算子

この章では、算術演算子、関係演算子、論理演算子、ビット演算子、代入演算子、その他の演算子を 1 つずつ紹介します。

算術演算子

次の表は、C++ でサポートされている算術演算子を示しています。

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

になります
OperatorDescriptionExample
+ 2 つのオペランドを追加しますA + B get 30
- 最初のオペランドから 2 番目のオペランド を引く A * B は 200 を取得します
/分子を分母で割ったものB / A は 2
を取得します% モジュロ演算子、除算後の剰余B % A は 0 を取得します
++増分演算子、整数値を 1 増やしますA++ は 11 を取得します
--減少演算子、減少整数値を 1A にすると 9

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

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

#include <iostream>
using namespace std;
 
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 ;
   c = a++; 
   cout << "Line 6 - c 的值是 " << c << endl ;
   c = a--; 
   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 的值是 21
Line 7 - c 的值是 22

関係演算子

次の表は、C++ でサポートされている関係演算子を示しています。

変数 A の値が 10、変数 B の値が 20 であるとします:

OperatorDescriptionInstance
== 2 つの値が一致するかどうかを確認しますオペランドが等しい。等しい場合、条件は true になります。 (A == B) は真実ではありません。
!= は、2 つのオペランドの値が等しいかどうかをチェックし、そうでない場合は条件が true です。 (A != B) は true です。
> 左のオペランドの値が右のオペランドの値より大きいかどうかを確認し、大きい場合は条件が true です。 (A > B) は真実ではありません。
< 左のオペランドの値が右のオペランドの値より小さいかどうかを確認し、そうであれば条件は true です。 (A < B) は true です。
>= 左のオペランドの値が右のオペランドの値以上であるかどうかを確認し、そうであれば条件が true です。 (A >= B) は真実ではありません。
<=左のオペランドの値が右のオペランドの値以下であるかどうかを確認し、そうであれば条件は true です。 (A <= B) は true です。

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

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

#include <iostream>
using namespace std;

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 であるとします。

OperatorDescriptionInstance
&& は、論理 AND 演算子と呼ばれます。両方のオペランドがゼロ以外の場合、条件は true になります。 (A && B) は誤りです。
||は論理OR演算子と呼ばれます。 2 つのオペランドのいずれかが 0 以外の場合、条件は true になります。 (A || B) は true です。
!は論理否定演算子と呼ばれます。オペランドの論理状態を反転するために使用されます。論理 NOT 演算子は、条件が true の場合、条件を false にします。 !(A && B) は true です。

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

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

#include <iostream>
using namespace std;

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 - 条件为真

ビットごとの演算子

ビットごとの演算子はビットに作用し、ビットごとに演算を実行します。 &、| および ^ の真の値は次のとおりです。 0

0010111111010011A&B = 0000 1100Operator
A = 60、B = 13 をバイナリ形式で表すと、次のようになるとします。 A = 0011 1100B = 0000 1101---- -------------
A|B = 0011 1101A^B = 0011 0001~A = 1100 0011次の表は、C++ を示しています。ビット単位の演算子をサポートします。変数 A の値が 60、変数 B の値が 13 であると仮定すると、次のようになります。

Description

Instance

&

両方のオペランドに同時に存在する場合、バイナリ AND演算文字が結果にコピーされます。

(A & B) は 12 を返します。これは 0000 1100 です

|

どちらかのオペランドに存在する場合、バイナリ OR 演算子は 1 ビットを結果にコピーします。

(A | B) は、0011 1101 である 61 を取得します^ オペランドの 1 つに存在し、両方に存在しない場合、バイナリ XOR 演算子は 1 ビットを結果にコピーします。 (A ^ B) は 49 を返します。これは 0011 0001 です~ 2 の補数演算子は、ビットを「反転」する効果がある単項演算子です。 (~A ) は -61 を取得します。これは 1100 0011、2 の補数、符号付き 2 進数です。 <<二項左シフト演算子。左オペランドの値は、右オペランドで指定されたビット数だけ左にシフトされます。 A << 2 は 240 を取得します。これは 1111 0000 です>> 2 項右シフト演算子。左オペランドの値は、右オペランドで指定されたビット数だけ右にシフトされます。 A >> 2 は 15、つまり 0000 1111 になります

C++ で使用できるビット単位の演算子を理解するには、以下の例を参照してください。

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

#include <iostream>
using namespace std;

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^=ビットごとの排他的 OR および代入演算子C ^= 2 は C = C ^ 2|=ビットごとの OR および代入演算子C |= 2 は C = C | 2 と同等です

C++ で使用できる代入演算子について学ぶには、以下の例を見てください。

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

#include <iostream>
using namespace std;

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) は 4 を返します (a は整数)。
条件 ? X : Y 条件演算子。 Condition が true の場合、値は X になります。それ以外の場合、値は Y になります。
, カンマ演算子は、一連の操作を順番に実行します。カンマ式全体の値は、カンマ区切りリストの最後の式の値です。
. (ドット) および -> (矢印) メンバー演算子は、クラス、構造体、および共用体のメンバーを参照するために使用されます。
Castキャスト演算子は、あるデータ型を別のデータ型に変換します。たとえば、int(2.2000) は 2 を返します。
&ポインタ演算子 & 変数のアドレスを返します。たとえば、&a; は変数の実際のアドレスを示します。
*ポインタ演算子 * 変数を指します。たとえば、*var; は変数 var を指します。

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

演算子の優先順位により、式内の項の組み合わせが決まります。これは式の評価方法に影響します。一部の演算子は他の演算子より優先順位が高くなります。たとえば、乗算演算子と除算演算子は加算演算子や減算演算子よりも優先順位が高くなります。

たとえば、x = 7 + 3 * 2、ここでは、演算子 * の優先順位が + よりも高いため、x には値 20 ではなく値 13 が割り当てられ、乗算 3*2 が最初に計算され、次に 7 が加算されます。 。

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

関係 待って == != 左から右へ bit AND AND & 左から右へ bit XOR XOR ^ 左から右へ ビットごとの OR | 左から右へ 論理AND && 左から右へ 論理OR OR || 左から右へ 条件 ? : 右から左へ割り当て= += -= *= /= %=>>= <<= &= ^= |= 右から左へカンマ、左から右へ例
カテゴリ 演算子 結合性
サフィックス () [] -> ++ - - 左から右へ
ドル+ - ~ + + - - (型)* & sizeof 右から左へ
乗算と除算 * / % 左から右へ
加減算 + - 左から右
<< >>
< <= >=
C++における演算子の優先順位を理解するには、次の例を見てください。

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

括弧がある場合とない場合の違いを比較すると、異なる結果が得られます。 ()、/、*、および + は優先順位が異なるため、優先順位の高い演算子が最初に評価されます。

#include <iostream>
using namespace std;
 
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