C 演算子


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

  • 算術演算子

  • 関係演算子

  • 論理演算子

  • ビット演算子

  • 代入演算子

  • その他の演算子

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

算術演算子

次の表は、C 言語でサポートされているすべての算術演算子を示しています。変数 A の値が 10、変数 B の値が 20 であると仮定すると、次のようになります。

A+ B は 30 を取得します
- 最初のオペランド A から 2 番目のオペランド を減算します。 A - B は​​ -10
* 2 つのオペランドを掛けます A * B は 200 になります
/分子を分母で割るとB / Aは2
%モジュロ演算子、整数除算後の剰余B % Aは0
++インクリメント演算子、整数値を 1 増やすA++ は 11
を取得します --デクリメント演算子、整数値を 1 減らすA -- は 9

C 言語で使用できるすべての算術演算子については、以下の例を参照してください:

#include <stdio.h>main(){   int a = 21;   int b = 10;   int c ;

   c = a + b;
   printf("Line 1 - c 的值是 %d\n", c );
   c = a - b;
   printf("Line 2 - c 的值是 %d\n", c );
   c = a * b;
   printf("Line 3 - c 的值是 %d\n", c );
   c = a / b;
   printf("Line 4 - c 的值是 %d\n", c );
   c = a % b;
   printf("Line 5 - c 的值是 %d\n", c );
   c = a++; 
   printf("Line 6 - c 的值是 %d\n", c );
   c = a--; 
   printf("Line 7 - c 的值是 %d\n", c );}

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

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

関係演算子

下の表は、以下を示しますC 言語でサポートされるすべての関係演算子。変数 A の値が 10 で、変数 B の値が 20 であるとします。

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

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

#include <stdio.h>main(){   int a = 21;   int b = 10;   int c ;   if( a == b )   {
      printf("Line 1 - a 等于 b\n" );   }   else   {
      printf("Line 1 - a 不等于 b\n" );   }   if ( a < b )   {
      printf("Line 2 - a 小于 b\n" );   }   else   {
      printf("Line 2 - a 不小于 b\n" );   }   if ( a > b )   {
      printf("Line 3 - a 大于 b\n" );   }   else   {
      printf("Line 3 - a 不大于 b\n" );   }   /* 改变 a 和 b 的值 */
   a = 5;
   b = 20;   if ( a <= b )   {
      printf("Line 4 - a 小于或等于 b\n" );   }   if ( b >= a )   {
      printf("Line 5 - b 大于或等于 b\n" );   }}

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

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

論理演算子

次の表は、C 言語でサポートされているすべての関係論理演算子を示しています。変数 A の値が 1、変数 B の値が 0 であると仮定します。

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

C 言語で使用できるすべての論理演算子を理解するには、以下の例をご覧ください:

#include <stdio.h>main(){   int a = 5;   int b = 20;   int c ;   if ( a && b )   {
      printf("Line 1 - 条件为真\n" );   }   if ( a || b )   {
      printf("Line 2 - 条件为真\n" );   }   /* 改变 a 和 b 的值 */
   a = 0;
   b = 10;   if ( a && b )   {
      printf("Line 3 - 条件为真\n" );   }   else   {
      printf("Line 3 - 条件不为真\n" );   }   if ( !(a && b) )   {
      printf("Line 4 - 条件为真\n" );   }}

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

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

ビットごとの演算子

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

0010111111010011A&B = 0000 1100AB の値が 13 であると仮定すると、次のようになります。同時に、バイナリ AND 演算子は 1 ビットを結果にコピーします。
A = 60、B = 13 をバイナリ形式で表すと、次のようになるとします。 A = 0011 1100B = 0000 1101---- -------------
A|B = 0011 1101A^B = 0011 0001~A = 1100 0011次の表は、C を示しています。言語 サポートされているビット単位の演算子。変数 の値が 60、変数
(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 ですA >> 2 は 15、つまり 0000 1111 になります
<<二項左シフト演算子。左オペランドの値は、右オペランドで指定されたビット数だけ左にシフトされます。
>> 2 項右シフト演算子。左オペランドの値は、右オペランドで指定されたビット数だけ右にシフトされます。

C 言語で使用できるすべてのビット演算子については、以下の例を参照してください:

#include <stdio.h>main(){   unsigned int a = 60;/* 60 = 0011 1100 */  
   unsigned int b = 13;/* 13 = 0000 1101 */   int c = 0;           

   c = a & b;       /* 12 = 0000 1100 */ 
   printf("Line 1 - c 的值是 %d\n", c );

   c = a | b;       /* 61 = 0011 1101 */
   printf("Line 2 - c 的值是 %d\n", c );

   c = a ^ b;       /* 49 = 0011 0001 */
   printf("Line 3 - c 的值是 %d\n", c );

   c = ~a;          /*-61 = 1100 0011 */
   printf("Line 4 - c 的值是 %d\n", c );

   c = a << 2;     /* 240 = 1111 0000 */
   printf("Line 5 - c 的值是 %d\n", c );

   c = a >> 2;     /* 15 = 0000 1111 */
   printf("Line 6 - c 的值是 %d\n", c );}

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

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

代入演算子

リストの下の表C 言語でサポートされている代入演算子:

>>=右シフトおよび代入演算子C >>= 2 は C = C >2 と同等です&=ビットごとのANDと代入演算子C &= 2はC = C & 2と同等^=ビットごとのXORと代入演算子C ^= 2はIn Cと同等= C ^ 2|=ビットごとの OR と代入演算子C |= 2 は C = C | 2
OperatorDescriptionExample
=単純な代入演算子、右オペランドの値を左オペランドに代入します 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
%=modulo と代入演算子、法を求めます2 つのオペランドの値を左のオペランド C %= A に代入します。これは C = C % A
<<=左シフトおよび代入演算子C << ; と同等です。 = 2 は C = C <2
例と同等です

C All 代入を理解するには、次の例を見てください。この言語で使用できる演算子:

#include <stdio.h>main(){   int a = 21;   int c ;

   c =  a;
   printf("Line 1 - =  运算符实例,c 的值 = %d\n", c );

   c +=  a;
   printf("Line 2 - += 运算符实例,c 的值 = %d\n", c );

   c -=  a;
   printf("Line 3 - -= 运算符实例,c 的值 = %d\n", c );

   c *=  a;
   printf("Line 4 - *= 运算符实例,c 的值 = %d\n", c );

   c /=  a;
   printf("Line 5 - /= 运算符实例,c 的值 = %d\n", c );

   c  = 200;
   c %=  a;
   printf("Line 6 - %= 运算符实例,c 的值 = %d\n", c );

   c <<=  2;
   printf("Line 7 - <<= 运算符实例,c 的值 = %d\n", c );

   c >>=  2;
   printf("Line 8 - >>= 运算符实例,c 的值 = %d\n", c );

   c &=  2;
   printf("Line 9 - &= 运算符实例,c 的值 = %d\n", c );

   c ^=  2;
   printf("Line 10 - ^= 运算符实例,c 的值 = %d\n", c );

   c |=  2;
   printf("Line 11 - |= 运算符实例,c 的值 = %d\n", c );}

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

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

その他の演算子 ↦ sizeof & ternary

次の表は、C 言語でサポートされている演算子のリストです。 その他の重要な演算子には次のものがあります。

サイズは?

Operatorsizeof()&*? :

C 言語で使用できるさまざまな演算子すべてについて学ぶために、以下の例を見てください:

#include <stdio.h>main(){   int a = 4;   short b;   double c;   int* ptr;   /* sizeof 运算符实例 */
   printf("Line 1 - 变量 a 的大小 = %d\n", sizeof(a) );
   printf("Line 2 - 变量 b 的大小 = %d\n", sizeof(b) );
   printf("Line 3 - 变量 c 的大小 = %d\n", sizeof(c) );   /* & 和 * 运算符实例 */
   ptr = &a;/* 'ptr' 现在包含 'a' 的地址 */
   printf("a 的值是 %d\n", a);
   printf("*ptr 是 %d\n", *ptr);   /* 三元运算符实例 */
   a = 10;
   b = (a == 1) ? 20: 30;
   printf( "b 的值是 %d\n", b );

   b = (a == 10) ? 20: 30;
   printf( "b 的值是 %d\n", b );}

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

a 的值是 4*ptr 是 4b 的值是 30b 的值是 20

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

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

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

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

DescriptionInstance
変数のサイズを返します。 sizeof(a) は 4 を返します (a は整数)。
変数のアドレスを返します。 &a; は変数の実際のアドレスを示します。
は変数を指します。 *a; は変数を指します。
条件式 条件が true の場合、値は X です。それ以外の場合、値は Y
関係 待って == != 左から右へ bit AND AND & 左から右へ bit XOR XOR ^ 左から右へ ビットごとの OR | 左から右へ 論理AND && 左から右へ 論理OR OR || 左から右へ 条件 ? : 右から左へ割り当て= += -= *= /= %=>>= <<= &= ^= |= 右から左へカンマ、例
カテゴリ 演算子 結合性
サフィックス () [] -> ++ - - 左から右へ
ドル+ - ~ + + - - (型)* & sizeof 右から左へ
乗算と除算 * / % 左から右へ
加減算 + - 左から右
<< >>
< <= >=
左から右に
C言語の演算子の優先順位を理解するには、次の例を見てください:

#include <stdio.h>main(){   int a = 20;   int b = 10;   int c = 15;   int d = 5;   int e;
 
   e = (a + b) * c / d;      // ( 30 * 15 ) / 5
   printf("(a + b) * c / d 的值是 %d\n",  e );

   e = ((a + b) * c) / d;    // (30 * 15 ) / 5
   printf("((a + b) * c) / d 的值是 %d\n" ,  e );

   e = (a + b) * (c / d);   // (30) * (15/5)
   printf("(a + b) * (c / d) 的值是 %d\n",  e );

   e = a + (b * c) / d;     //  20 + (150/5)
   printf("a + (b * c) / d 的值是 %d\n" ,  e );  
   return 0;}

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

(a + b) * c / d 的值是 90((a + b) * c) / d 的值是 90(a + b) * (c / d) 的值是 90a + (b * c) / d 的值是 50