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

C言語に定義されている演算子は、加減乗除などの四則演算から論理和・論理積などの論理演算まで多岐にわたります。本記事では、代表的な演算子の使い方を解説していきます。
演算子とは何か?
演算子とは、プログラムで使用される数値や変数などのデータを操作するために用いられる記号のことです。
C言語では、様々な種類の演算子が用意されており、それぞれ特定の動作を行います。
例えば、+
は加算演算子であり、左右のオペランド(演算対象)を足し合わせます。
-
は減算演算子であり、左側から右側を引きます。
また、*
は乗算演算子であり、左右のオペランドを掛け合わせます。
このように、C言語では基本的な四則演算だけでなく論理和・論理積・ビット単位論理和・ビット単位論理積・シフト等々多彩な種類の演算子を使用できます。
算術演算子の使い方
C言語では、算術演算子は数値の計算を行うために使用されます。
C言語では、以下の5つの算術演算子があります。
- 加算演算子(+)
- 減算演算子(-)
- 乗算演算子(*)
- 除算演算子(/)
- 剰余演算子(%)
加算演算子(+)
加算演算子は、2つの数値を足し算するときに使用されます。
例えば、次のようなコードで変数a
とb
を足し合わせることができます。
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
三項演算子の使い方
三項演算子は、条件式を評価して結果に応じて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
上記コードでは、a
とb
という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言語では、算術演算子、関係演算子、論理演算子、三項演算子、シフト演算子などがあります。
それぞれの使い方をしっかりと覚えることで、より高度なプログラムを作成することが可能です。
しかし、適切に使用しない場合は予期せぬバグやエラーが発生する可能性もあるため注意が必要です。正しい使い方をマスターして効率的なコーディングを行うよう心掛けましょう。