「C言語】演算子についてわかりやすく解説

C言語に定義されている演算子は、加減乗除などの四則演算から論理和・論理積などの論理演算まで多岐にわたります。本記事では、代表的な演算子の使い方を解説していきます。

目次

演算子とは何か?

演算子とは、プログラムで使用される数値や変数などのデータを操作するために用いられる記号のことです。

C言語では、様々な種類の演算子が用意されており、それぞれ特定の動作を行います。

例えば、+は加算演算子であり、左右のオペランド(演算対象)を足し合わせます。

-は減算演算子であり、左側から右側を引きます。

また、*は乗算演算子であり、左右のオペランドを掛け合わせます。

このように、C言語では基本的な四則演算だけでなく論理和・論理積・ビット単位論理和・ビット単位論理積・シフト等々多彩な種類の演算子を使用できます。

算術演算子の使い方

C言語では、算術演算子は数値の計算を行うために使用されます。

C言語では、以下の5つの算術演算子があります。

  • 加算演算子(+)
  • 減算演算子(-)
  • 乗算演算子(*)
  • 除算演算子(/)
  • 剰余演算子(%)

加算演算子(+)

加算演算子は、2つの数値を足し算するときに使用されます。

例えば、次のようなコードで変数abを足し合わせることができます。

int a = 10;
int b = 20;
int c = a + b; // cには30が代入される

減算演算子(-)

減算演算子は、2つの数値の引き算をするために使用されます。

例えば、次のようなコードで変数aからbを引くことができます。

int a = 20;
int b = 10;
int c = a - b; // cには10が代入される

乗算演算子(*)

乗算演算子は、2つの数値の掛け算をするために使用されます。

例えば、次のようなコードでは、変数aとbの掛け算をしています。

int a = 3;
int b = 4;
int c = a * b; // cには12が代入される

除算演算子(/)

除算演算子は、割り算の商を返します。

#include <stdio.h>

void main()
{
    int x, y, z;

    x = 9;
    y = 2;
    z = x / y;

    printf("%d\n",z);
}
4

この場合、「x」と「y」両方共とも整数型(int)であるため、「x/y」の計算結果の小数点以下は切り捨てられています。

小数点以下を切り捨てずに計算する場合はfloat型・double型といった小数点以下の数値を保持できる値(もしくは型キャストする)で計算します。

#include <stdio.h>

void main()
{
    float x, y, z;

    x = 9;
    y = 2;
    z = x / y;

    printf("%f\n",z);
}
4.500000

剰余演算子(%)

剰余演算子(%) を用いれば,正数同士の割り算の余り (modulus remainder) を求められます.

#include <stdio.h>

void main()
{
    int x, y, z;

    x = 7;
    y = 3;
    z = x % y;

    printf("%d\n",z);
}
1

以上が、C言語で使用できる算術演算子です。

関係演算子の使い方

関係演算子は、2つの値を比較するために使用されます。C言語では、以下の関係演算子があります。

  • 等しいかどうかを判定する「==」
  • 等しくないことを判定する「!=」
  • 大小関係を比較する「>」「<」「>=」「<=」

等しいかどうかを判定する「==」

等しいことを判定するために使用される演算子です。

左辺と右辺が等しければ真(true)を返します。例えば、以下のようなコードでは、変数aとbが等しいかどうかを判断できます。

int a = 10;
int b = 20;

if (a == b) {
    printf("aとbは等しい\n");
} else {
    printf("aとbは異なる\n");
}

上記のコードでは、「a == b」が評価されてfalse(偽)になり、「aとbは異なる」と出力されます。

等しくないことを判定する「!=」

不等号(not equal to)または否定的な意味合いで使われる演算子です。

「==」演算子の逆です。左辺と右辺が異なっていれば真(true)を返します。

例えば、以下のように書くことができます。

int a = 10;
int b = 20;

if (a != b) {
    printf("aとbは異なる\n");
} else {
    printf("aとbは等しい\n");
}

上記のコードでは、「a != b」が評価されてtrue(真)になり、「aとbは異なる」と出力されます。

大小関係を比較する「>」「<」「>=」「<=」

大小関係や大小イコール関係を比較するために使用されます。

「>」や「<」だけで比較した場合、それぞれ大きければ真(true)、小さければ偽(false)を返します。

「>=」や「<=」だけで比較した場合、それぞれ大きくても同じでも真(true)、小さくても同じでも偽(false) を返します。例えば、

int a = 10;
int b = 20;

if (a > b) {
    printf("a よりも b の方が大きい\n");
} else if ( a < b ) { 
    printf("b よりも a の方が小さい\n");    
}

上記のコードでは、a > bという条件式から始まっています。

ですが、「a(10) > b(20)」という条件式自体は正しく成立しておらず,次々にelse if文内部へ移動しています。

最終的に、 "b よりも a の方が小さい" が表示されます。

論理演算子の使い方

論理演算子は、真偽値を扱うための演算子です。

C言語においては、AND演算子「&&」、OR演算子「||」、排他的論理和「^」、否定「!」があります。

AND 演算子 「&&」

AND演算子は、「かつ」という意味で使われます。

例えば、「aが1以上5以下の範囲内にあるかつbが10未満である」という条件を表す場合に使用します。

if (a >= 1 && a <= 5 && b < 10) {
    // 条件を満たしたときの処理
}

上記のように、&&を使うことで複数の条件を指定することが出来ます。

OR 演算子 「||」

OR演算子は、「または」という意味で使われます。

例えば、「aが0以下またはbが100以上である」という条件を表す場合に使用します。

if (a <= 0 || b >= 100) {
    // 条件を満たしたときの処理
}

上記のように、条件式を連結することで複数の条件から一つでも成立していればtrue(真)となります。

排他的論理和 (^)

排他的論理和は、「どちらか一方だけがtrue(真)である場合」true(真)となります。

C言語ではビット単位で計算されるため、2進数表現された値同士の比較や操作時に用いられます。

int a = 3;   //0011(2進数)
int b = 6;   //0110(2進数)
int c = a ^ b;//0101(2進数)

printf("%d", c);    // 結果:5

通常の算術演算ではめったに使われませんが、ビット単位でのフラグ管理などで主に使われます。

否定 (!)

否定演算子(!)は与えられた式や変数の値が0なら1、反対に0以外なら1を返します。

int flag = 0;
if (!flag){
   	printf("flag is false");
} else {
   	printf("flag is true");
}
flag is false

C言語にはbool型が存在しないため、他言語ではfalseとなる値は0、trueとなる値が1と表されることが多いです。

三項演算子の使い方

三項演算子は、条件式を評価して結果に応じて2つの値のうちどちらかを返す演算子です。以下にその使い方を説明します。

構文

(条件式) ? (真の場合の値) : (偽の場合の値);

#include <stdio.h>

int main() {
    int a = 10, b = 20;
    int max_value;

    // 条件式が true の場合、a を代入する。
    // false の場合、b を代入する。
    max_value = (a > b) ? a : b;

    printf("max value is %d\n", max_value);

    return 0;
}
max value is 20

上記コードでは、abという2つの変数があります。そして、三項演算子を使用してこれら2つの変数から大きな方を選択し、それを max_value 変数に格納しています。

if-else文を用いた分岐を含む代入処理を1行で行えるため、プログラムに寄っては可読性が上がります。

シフト演算子の使い方

シフト演算子は、ビット単位での左右へのシフトを行うために使用されます。

C言語には2種類のシフト演算子があります。

左シフト演算子(<<)

左シフト演算子は、指定したビット数だけ対象となる値を左に移動させます。移動後、右側に空いた部分は0で埋められます。

例えば、以下のようなコードでは変数aの値を2ビット左にシフトしています。

int a = 10; // 00001010 (2進数)
a = a << 2; // 00101000 (2進数) => 40 (10進数)

右シフト演算子(>>)

右シフト演算子は、指定したビット数だけ対象となる値を右に移動させます。移動後、左側に空いた部分は符号ビットと同じ値で埋められます。

例えば、以下のようなコードでは変数bの値を1ビット右にシフトしています。

int b = -8; // 11111000 (2進数)
b = b >> 1; // 11111100 (2進数) => -4 (10進数)

注意点として、ビットシフトを行えるのはchar short int logといった整数型の値のみです。float型などの少数を扱える方はエラーになるので注意しましょう。

sizeof() 演算子の使い方

「sizeof()」演算子は、変数やデータ型のサイズをバイト単位で取得するために使用されます。

この演算子は、C言語プログラムでメモリ管理を行う際に非常に重要です。

以下は、「sizeof()」演算子の使い方の例です。

#include <stdio.h>

int main()
{
    int a;
    float b;
    double c;

    printf("Size of int: %ld bytes\n", sizeof(a));
    printf("Size of float: %ld bytes\n", sizeof(b));
    printf("Size of double: %ld bytes\n", sizeof(c));

    return 0;
}

上記のコードでは、整数型変数「a」、浮動小数点型変数「b」、倍精度浮動小数点型変数「c」それぞれのサイズを表示しています。実行結果は以下となります。

Size of int: 4 bytes
Size of float: 4 bytes
Size of double: 8 bytes

また、「sizeof()」演算子は配列でも使用することが出来ます。以下は、「sizeof()」演算子を用いて配列の要素数を求める例です。

#include <stdio.h>

int main()
{
   int arr[] = {1,2,3,4,5};
   int size = sizeof(arr)/sizeof(int);

   printf("配列の要素数 : %d\n", size);
   
   return 0;
}
配列の要素数 : 5

上記のコードでは、整数型配列「arr」の要素数(5)をsizeof演算子を使って求めています。

sizeof(配列) / sizeof(配列の型)で要素数を計算できるため、ループ回数の計算などを行えます。

まとめ

演算子は、プログラミングにおいて非常に重要な役割を果たします。

C言語では、算術演算子、関係演算子、論理演算子、三項演算子、シフト演算子などがあります。

それぞれの使い方をしっかりと覚えることで、より高度なプログラムを作成することが可能です。

しかし、適切に使用しない場合は予期せぬバグやエラーが発生する可能性もあるため注意が必要です。正しい使い方をマスターして効率的なコーディングを行うよう心掛けましょう。

目次