演算子の種類

 プログラムの中で処理を表現するために、演算子を使用します。次のような種類があります。

■ 算術演算子

 値を計算します。

演算子 意味 使用例
+ 一方の数値を他方の数値に足す num1 + num2
- 一方の数値を他方の数値から引く num1 – num2
- 数値の符号を反転させる -num1
* 一方の数値に他方の数値を掛ける num1 * num2
/ 一方の数値を他方の数値で割る num1 / num2
% 一方の数値を他方の数値で割った時の余りを求める num1 % num2
++ 1加算する(インクリメント)
変数の前に置くか後に置くかで計算するタイミングが違う
num1++
++num1
-- 1減算する(デクリメント)
変数の前に置くか後に置くかで計算するタイミングが違う
num1--
--num1
<< 数値のビット・パターンを左にシフトする num1 << 1
>> 数値のビット・パターンを右にシフトする num1 >> 1
算術演算子

○ ファイル

 次のようにファイルを作成してください。

ファイル名 arithmeticTest.c

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

  1. #include <stdio.h>
  2. int main(void){
  3.  //変数の宣言
  4.  int num1 = 10;
  5.  int num2 = 3;
  6.  //算術演算の結果を表示する
  7.  printf("加算:%d\n", num1 + num2);
  8.  printf("減算:%d\n", num1 - num2);
  9.  printf("反転:%d\n", -num1);
  10.  printf("乗算:%d\n", num1 * num2);
  11.  printf("除算:%d\n", num1 / num2);
  12.  printf("剰余:%d\n", num1 % num2);
  13.  printf("インクリメント:%d\n", num1++);
  14.  printf("デクリメント:%d\n", num1--);
  15.  printf("右シフト:%d\n", num1 << 1);
  16.  printf("左シフト:%d\n", num1 >> 1);
  17.  return 0;
  18. }

○ 実行結果

加算:13
減算:7
反転:-10
乗算:30
除算:3
剰余:1
インクリメント:10
デクリメント:11
右シフト:20
左シフト:5

○ 解説

 5、6行目では2つの変数を初期化しています。9~16行目で算術演算をして結果を表示しています。

 17行目では変数のデータを2進数表現で左側にずらします。1つ、ずらすと10進数で2倍しているのと同じことになります。2つ、ずらすと4倍、3つ、ずらすと8倍と1つ、ずらすごとに2の2乗倍することになります。18行目は変数のデータを2進数表現で右側にずらします。1つ、ずらすと10進数で、2で割っているのと同じことになります。2つ、ずらすと4で割る、3つ、ずらすと8で割ると、1つずつ、ずらすごとに2の2乗で割っていることになります。

■ 代入演算子

 計算結果を代入します。

演算子 意味 使用例
= データを変数に代入する num = 2
*= 変数に格納されているデータと乗算し、その結果を変数に代入する num *= 2
/= 変数に格納されているデータと除算し、その結果を変数に代入する num /= 2
%= 変数に格納されているデータと除算し、その余りを変数に代入する num %= 2
+= 変数に格納されているデータと加算し、その結果を変数に代入する num += 2
-= 変数に格納されているデータを減算し、その結果を変数に代入する num -= 2
<<= 変数に格納されているデータを左シフトし、その結果を変数に代入する num <<= 2
>>= 変数に格納されているデータを右シフトし、その結果を変数に代入する num >>= 2
代入演算子

○ ファイル

 次のようにファイルを作成してください。

ファイル名 assignmentTest.c

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

  1. #include <stdio.h>
  2. int main(void){
  3.  //変数の宣言
  4.  int num;
  5.  //代入演算の結果を表示する
  6.  num = 10;
  7.  printf("代入:%d\n", num);
  8.  num *= 2;
  9.  printf("乗算:%d\n", num);
  10.  num /= 2;
  11.  printf("除算:%d\n", num);
  12.  num %= 3;
  13.  printf("剰余:%d\n", num);
  14.  num += 2;
  15.  printf("加算:%d\n", num);
  16.  num -= 1;
  17.  printf("減算:%d\n", num);
  18.  num <<= 1;
  19.  printf("左シフト:%d\n", num);
  20.  num >>= 2;
  21.  printf("右シフト:%d\n", num);
  22.  return 0;
  23. }

○ 実行結果

代入:10
乗算:20
除算:10
剰余:1
加算:3
減算:2
左シフト:4
右シフト:1

○ 解説

 8行目は変数numに10を格納します。10行目は先ほど格納した「10」に2を乗算して再び変数numに格納します。12行目は先ほど格納した「20」を2で除算して変数numに格納します。14行目は先ほど格納した「10」に3で除算した余りを変数numに格納します。16行目は先ほど格納した「1」に2を加算して変数numに格納します。18行目は先ほど格納した「3」を1で減算して変数numに格納します。20行目は先ほど格納した「2」を左に1ビット分ずらして、変数numに格納します。22行目は先ほど格納した「4」を右に2ビット分ずらして、変数numに格納します(格納される値は1)。

■ 比較演算子

 条件を比較して真(0以外)か偽(0)を算出します。

演算子 意味 使用例
== 2つのデータが等しいことを確認する num1 == num2
!= 2つのデータが等しくないことを確認する num1 != num2
< 一方のデータが他方のデータより小さいことを確認する num1 < num2
> 一方のデータが他方のデータより大きいことを確認する num1 > num2
<= 一方のデータが他方のデータ以下であることを確認する num1 <= num2
>= 一方のデータが他方のデータ以上であることを確認する num1 >= num2
比較演算子

○ ファイル

 次のようにファイルを作成してください。

ファイル名 relationalTest.c

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

  1. #include <stdio.h>
  2. int main(void){
  3.  //変数の宣言
  4.  int num1 = 10;
  5.  int num2 = 5;
  6.  //比較した結果を表示する
  7.  printf("等しい:%d\n", num1 == num2);
  8.  printf("等しくない:%d\n", num1 != num2);
  9.  printf("より小さい:%d\n", num1 < num2);
  10.  printf("より大きい:%d\n", num1 > num2);
  11.  printf("以下:%d\n", num1 <= num2);
  12.  printf("以上:%d\n", num1 >= num2);
  13.  return 0;
  14. }

○ 実行結果

等しい:0
等しくない:1
より小さい:0
より大きい:1
以下:0
以上:1

○ 解説

 9行目は変数num1の値と変数num2の値が等しいかどうかを判断します。等しくないので「0」が出力されます。10行目は変数num1の値と変数num2の値が等くないかどうかを判断します。等しくないので「1」が出力されます。11行目は変数num1の値が変数num2の値がより小さいかどうかを判断します。小さくないので「0」が出力されます。12行目は変数num1の値が変数num2の値より大きいかどうかを判断します。大きいので「1」が出力されます。13行目は変数num1の値が変数num2の値以下かどうかを判断します。以下ではないので「0」が出力されます。14行目は変数num1の値が変数num2の値以上かどうかを判断します。以上なので「1」が出力されます。

 C言語では条件が満たされない場合は0を、満たされる場合は0以外を出力します。

■ 論理演算子

 論理演算をして真(0以外)か偽(0)を算出します。

演算子 意味 使用例
! ブール値の論理否定を求める !(num1 < num2)
&& 2つのブール値の論理積を求める num1 > 1 && num1 < 10
|| 2つのブール値の論理和を求める num1 > 0 || num2 < 0
論理演算子

○ ファイル

 次のようにファイルを作成してください。

ファイル名 logicalTest.c

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

  1. #include <stdio.h>
  2. int main(void){
  3.  //変数の宣言
  4.  int num1 = 10;
  5.  int num2 = 5;
  6.  //比較した結果を表示する
  7.  printf("否定:%d\n", !(num1 < num2));
  8.  printf("論理積:%d\n", (num1 > 0 && num1 < 10));
  9.  printf("論理和:%d\n", (num1 > 0 || num1 < 10));
  10.  return 0;
  11. }

○ 実行結果

否定: 1
論理積: 0
論理和: 1

○ 解説

 9行目は変数num1と変数num2を比較します。今回は「10 < 5」となるので条件としては「0」です。しかし、「!」が付いているので否定として扱われ、「0ではない」つまり「1」と出力されます。

 10行目は2つの条件判断の結果をもとに判断します。今回は「num1 > 0」で「1」、「num1 < 10」で「0」となります。この2つの判断の結果を「1 && 0」のようにさらに判断します。結果は「0」になります。論理積は次のような結果が出力されます。2つの条件が「1」の場合のみ「1」となります。

条件1 条件2 出力
0 0 0
0 1 0
1 0 0
1 1 1
条件1 && 条件2の出力

 11行目は2つの条件判断の結果をもとに判断します。今回は「num1 > 0」で「1」、「num1 < 0」で「0」となります。この2つの判断の結果を「1 || 0」のようにさらに判断します。結果は「1」になります。論理和は次のような結果が出力されます。2つの条件のうち少なくともどちらか一方が「1」であれば「1」になります。

条件1 条件2 出力
0 0 0
0 1 1
1 0 1
1 1 1
条件1 || 条件2の出力

■ 三項演算子

 論理演算をして、2つの値のいずれかを返します。

三項演算子の書式
条件式 ? 真の時の値 : 偽の時の値

○ ファイル

 次のようにファイルを作成してください。

ファイル名 ternaryOperatorTest.c

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

  1. #include <stdio.h>
  2. int main(void){
  3.  //変数の宣言
  4.  int num1 = 10;
  5.  int num2 = 5;
  6.  //比較した結果を表示する
  7.  printf("判定結果:%s\n", num1 == num2 ? "等しい" : "等しくない");
  8.  return 0;
  9. }

○ 実行結果

(変数num1に10、変数num2に5が格納されている場合)

判定結果:等しくない

(変数num1に10、変数num2に10が格納されている場合)

判定結果: 等しい

○ 解説

 9行目で3項演算子を使用しています。変数num1と変数num2の値が等しい場合、「等しい」を返します。その文字列をprintf関数に指定しています。今回は文字列を指定するためにprintf関数の()内で「%s」を指定しています。ここに文字列を埋め込みます。変数num1と変数num2が等しくない場合は、「等しくない」を返します。

■ キャスト(型変換)

 C言語は異なるデータ型の変数にデータを代入するときに自動的に型変換が行われます。例えば、整数型の変数に実数型のデータを代入すると、整数型に変換されます。これを暗黙的型変換といいます。演算するときにも型変換が自動的に行われることがあります。例えば、整数型と整数型を演算すると、整数型の計算結果が出てきます。整数型と実数型の演算をすると、実数型の計算結果が出てきます。

 では、整数型と整数型の割り算などを行った結果、実数型が出てきたらどうなるでしょうか?結果として、整数型が出てきます。では、実数型を求めたいときにはどうすればいいのでしょうか?整数型と実数型を計算すると実数型を求めることができる仕組みを使います。整数型の値を実数型に変換すればよいわけです。

型変換の書式
(データ型)

○ ファイル

 次のようにファイルを作成してください。

ファイル名 typeConversionTest.c

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

  1. #include <stdio.h>
  2. int main(void){
  3.  //計算するデータを準備
  4.  int num1 = 5;
  5.  int num2 = 2;
  6.  //2種類の計算をする
  7.  printf("整数型として計算:%d\n", num1 / num2);
  8.  printf("実数型として計算:%f\n", (double)num1 / num2);
  9.  return 0;
  10. }

○ 実行結果

整数型として計算:2
実数型として計算:2.500000

○ 解説

 9行目では、整数型で計算しています。5割る2は2.5ですが、整数型なので、0.5が切り捨てられて「2」が出力されます。10行目では、整数型を実数型に型変換しています。このように変換する型を指定して変換することを、明示的型変換といいます。このように指定することで実数型の計算結果が出力されるので、「2.5」を取得することができます。

■ メモリのサイズを調べる

 メモリ上に用意されている変数や配列などにアクセスする際に、メモリのサイズを意識してプログラミングすることがあります。そのような時に仕えるのが、sizeof演算子です。

sizeof演算子の書式
sizeof()

○ ファイル

 次のようにファイルを作成してください。

ファイル名 sizeofTest.c

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

  1. #include <stdio.h>
  2. int main(void){
  3.  //変数を宣言
  4.  int num;
  5.  //変数のサイズを表示する
  6.  printf("int型のサイズ:%dバイト\n", sizeof(num));
  7.  printf("double型のサイズ:%dバイト\n", sizeof(double));
  8.  return 0;
  9. }

○ 実行結果

int型のサイズ:4バイト
double型のサイズ:8バイト

○ 解説

 8行目では、変数numのサイズを調べています。変数numはint型なので4バイトと表示されます。9行目では、double型のサイズを調べています。このようにデータ型名を指定することもできます。double型は8バイトと表示されます。

前へ   次へ