演算子

C言語には普段よく使われている四則演算の他、さまざまな演算子があります。


算術演算子

算術演算子一覧
演算子 構文 説明
+ x + y xにyを加えます。
- x - y xからyを引きます。
* x * y xにyを掛けます。
/ x / y xをyで割ります。
% x % y xをyで割った余りです。

▲PageTop

インクリメント・デクリメント演算子

インクリメント・デクリメント演算子一覧
演算子 構文 説明
++ ++x xに+1してxを評価します。(前置演算)
x++ xを評価したあとxに+1します。(後置演算)
-- --x xに-1してxを評価します。(前置演算)
x-- xを評価したあとxに-1します。(後置演算)

前置演算と後置演算の違い

前置演算と後置演算の違いは代入演算時や関数の引数に利用した場合など多くの場合に見られます。

例として代入演算時に使用した場合の動作を確認したいと思います。


・サンプルソース(sample0301.c)

#include <stdio.h>

int main() {
    int x = 1;
    int y;
    /* 代入演算での評価の違い */
    y = ++x;
    printf("前置演算( y = ++x; )\n");
    printf("x = %d\n", x);
    printf("y = %d\n", y);
    x = 1;
    y = x++;
    printf("後置演算( y = x++; )\n");
    printf("x = %d\n", x);
    printf("y = %d\n", y);
    
    return 0;
}

・実行結果

C:\dev\c>sample0301 [Enter]
前置演算( y = ++x; )
x = 2
y = 2
後置演算( y = x++; )
x = 2
y = 1  ← インクリメントされる前に代入されている
        

▲PageTop

ビット演算子

ビット演算子一覧
演算子 構文 説明
& x & y 論理積(AND)を行います。
| x | y 論理和(OR)を行います。
^ x ^ y 排他的論理和(XOR)を行います。
~ ~x 否定(NOT)を行います。

ビット演算子結果一覧

&(AND)
演算 結果
0 & 0 0
1 & 0 0
0 & 1 0
1 & 1 1
|(OR)
演算 結果
0 | 0 0
1 | 0 1
0 | 1 1
1 | 1 1
^(XOR)
演算 結果
0 ^ 0 0
1 ^ 0 1
0 ^ 1 1
1 ^ 1 0
~(NOT)
演算 結果
~0 1
~1 0

▲PageTop

シフト演算子

シフト演算子とはビットをずらしていく演算子です。但し、float型、double型、ポインタ型には使用することができません。


左シフト

数値xに対して左にnビットシフトさせる場合の書式は次のようになります。

x << n

左シフトによるビット変化のイメージは次のようになります。

左シフトイメージ

※2進数において桁が上がっていくことになるので、元の値に対して2倍していくことと同じになります。


右シフト

数値xに対して右にnビットシフトさせる場合の書式は次のようになります。
x >> n

右シフトの場合は対象となる変数の型が「符号付」の場合と「符号なし」の場合で処理が変わります。


・符号なしのとき

符号なしのときの右シフトは左シフトと同じ処理になります。これらを「論理シフト」と呼び、処理イメージは下図のようになります。

右シフトイメージ(符号なし)
・符号付のとき

符号付のときは左端のビットが符号の意味を持つため、シフトにより符号が変化しないよう元の値と同じ値で補充されます。このようなシフトは「算術シフト」と呼ばれ、処理イメージは下図のようになります。

シフトイメージ

※2進数において桁が下がっていくことになるので、元の値に対して1/2倍していくことと同じになります。

▲PageTop

代入演算子

代入演算子一覧
演算子 構文 説明
= x = y yをxに代入します。
+= x += y xに(x + y)を代入します。
-= x -= y xに(x - y)を代入します。
*= x *= y xに(x * y)を代入します。
/= x /= y xに(x / y)を代入します。
%= x %= y xに(x % y)を代入します。
&= x &= y xに(x & y)を代入します。
|= x |= y xに(x | y)を代入します。
^= x ^= y xに(x ^ y)を代入します。
<<= x <<= y xに(x << y)を代入します。
>>= x >>= y xに(x >> y)を代入します。

▲PageTop

論理演算子

論理演算子一覧
演算子 構文 説明
&& x && y 論理積(AND)を行います。
|| x || y 論理和(OR)を行います。
! !x 排他的論理和(XOR)を行います。

論理演算子結果一覧

&&(AND)
演算 結果
False && False False
True && False False
False && True False
True && True True
||(OR)
演算 結果
False || False False
True || False True
False || True True
True || True True
!(NOT)
演算 結果
!False True
!True False

論理演算子とビット演算子の違い

論理演算子とビット演算子の違いは、論理演算子の場合その結果がTrue(0以外はすべて1とみなす)またはFalse(0)のどちらかになるという事です。ですから、各オペランドの演算結果を値として取得する場合はビット演算子、真か偽かの判別を行いたい場合は論理演算を使用します。

▲PageTop

比較演算子

比較演算子一覧
演算子 構文 説明
== x == y xとyは等価である。
!= x != y xとyは等価ではない。
< x < y xはyより小さい(未満)。
<= x <= y xはy以下である。
> x > y xはyより大きい。
>= x >= y xはy以上である。

▲PageTop

順次演算子

「,」(カンマ)で区切られた式や値は左から順に評価されていきます。このときの「,」(カンマ)が順次演算子です。


・サンプルソース(sample0302.c)

#include <stdio.h>

int main() {
    int x,y; /* 宣言での順次演算子の例 */
    for (x=0, y=0; x<3; x++, y++) { /* for制御内での順次演算子の例 */
      x = x  * 1, y = y * 2; /* 式に対する順次演算子の例 */
        printf("x=%d, y=%d\n", x, y);
    }
    
    return 0;
}

・実行結果

C:\dev\c>sample0302 [Enter]
x=0, y=0
x=1, y=2
x=2, y=6

▲PageTop

条件演算子

条件演算子(三項演算子)は「if~else~」文と同じ処理を1行で記述する事が出来る演算子です。


・サンプルソース(sample0303.c)

#include <stdio.h>

int main() {
    int i, x=3, y=5;
    for (i=1; i<3; i++) {
      x = x*i;
      printf("X=%d, Y=%d\n", x, y);
      x > y ?  printf("XはYより大きい\n") : printf("XはYより小さい\n");
   }

   return 0;
}

・実行結果

C:\dev\c>sample0303 [Enter]
X=3, Y=5
XはYより小さい
X=6, Y=5
XはYより大きい
        

▲PageTop

演算子の優先順位

演算子優先順位表
優先順位 結合方向 演算子 種類
左から 「()」,「.」,「->」,「[]」,「++」,「--」 関数呼出し,ドット,アロー,添字,後置増分,後置減分
右から 「++」,「--」,「~」,「!」,「+」,「-」,「&」,「*」,「sizeof」 前置増減分,補数,論理否定,単項式
右から 「(型)」 キャスト
左から 「*」,「/」,「%」 二単項乗算,二単項除算,二単項剰余
左から 「+」,「-」 二単項加算,二単項減算
左から 「<<」,「>>」 シフト
左から 「<」,「<=」,「>」,「>=」 比較
左から 「==」,「!=」 比較
左から 「&」 AND(ビット積)
10 左から 「^」 排他OR(ビット差)
11 左から 「|」 OR(ビット和)
12 左から 「&&」 AND(論理積)
13 左から 「||」 OR(論理和)
14 右から 「?:」 条件
15 右から 「=」,「*=」,「/=」,「%=」,「+=」,「-=」,「<<=」,「>>=」,「&=」,「|=」,「^=」 代入,複合
16 左から 「,」 カンマ

▲PageTop