C言語基礎|加減乗除の演算子

計算を行うための基本的な道具

これまでのプログラムでは、
足したり、引いたり、掛けたり、割ったりといった計算を、何気なく行ってきました。

C言語では、こうした計算を行うために、

  • 記号
  • ルール

がきちんと決められています。

計算を指示する記号のことを 演算子 と呼び、
この記事では、最も基本となる 加減乗除の演算子 を整理して学習します。

乗除演算子と加減演算子

C言語で使われる基本的な計算用の演算子は、大きく次の2種類に分けられます。

  • 乗除演算子(multiplicative operator)
  • 加減演算子(additive operator)

まずは、それぞれを表で確認してみましょう。

乗除演算子

演算子書式意味
*a * ba と b の積
/a / ba を b で割った商(整数どうしの場合は小数点以下を切り捨て)
%a % ba を b で割った剰余(a と b は整数でなければならない)

加減演算子

演算子書式意味
+a + ba と b の和
-a - ba から b を引いた値

これらはすべて 2項演算子 であり、
左右に二つのオペランドを取って計算を行います。

除算には2種類ある

C言語では、「割り算」を行う演算子が2つあります。

  • / 演算子:商を求める。
  • % 演算子:剰余(あまり)を求める。

同じ割り算でも、役割はまったく異なります。

/ 演算子:商を求める

/ 演算子は、割り算の を求めます。

特に注意が必要なのは、整数どうしの割り算 です。

結果
5 / 31
3 / 50

整数どうしの場合、小数点以下は切り捨てられます。
これはエラーではなく、C言語の仕様どおりの動作です。

% 演算子:剰余を求める

% 演算子は、割り算の 余り を求めます。

結果
5 % 32
3 % 53

なお、% 演算子のオペランドは 両方とも整数 でなければなりません。

printf 関数で % を表示する方法

ここで一つ、表示に関する重要な注意点があります。

printf 関数では、% は 変換指定の開始文字 として使われます。
そのため、画面に % をそのまま表示したい場合は、次のように書きます。

printf("%%\n");   // % を1文字表示

一方、書式指定を持たない puts 関数では、
そのまま % を書くことができます。

puts("%");        // % を1文字表示

この違いは、printf と puts の性質の違いによるものです。

剰余を使った実用的な例

% 演算子は、実際のプログラムでとてもよく使われます。
その代表例が「最下位桁を取り出す」処理です。

サンプルプログラム:最下位桁を求める

プロジェクト名:chap2-2-1 ソースファイル名:chap2-2-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 入力された整数の一番右の数字を表示する

#include <stdio.h>

int main(void)
{
    int value;

    printf("整数を入力してください:");
    scanf("%d", &value);

    printf("一番右の数字は%dです。\n", value % 10);

    return 0;
}

実行例

整数を入力してください:1090
一番右の数字は0です。

整数を入力してください:1090
一番右の数字は0です。

なぜこれで最下位桁が分かるのか

10 で割ったときの剰余は、
必ず 最下位の1桁 になります。

数値割り算剰余
13571357 ÷ 107
17801780 ÷ 100

この性質は、後の章で学ぶ

  • 桁ごとの処理
  • 数値の分解

でも頻繁に利用されます。

除算と剰余の正式な定義

標準Cでは、除算と剰余の結果は次のように定義されています。

  • / 演算子
    代数的な商から小数部を切り捨てた値
  • % 演算子
    (a / b) * b + a % b が a と等しくなる値

この定義により、オペランドが負の場合でも結果が決まります。

符号を含む演算結果の例

x / yx % y
22 / 5 = 422 % 5 = 2
-22 / -5 = 4-22 % -5 = -2
22 / -5 = -422 % -5 = 2
-22 / 5 = -4-22 % 5 = -2

なお、第2オペランドが 0 の場合の動作は、言語では定義されていません。
多くの環境では、実行時エラーとなりプログラムが中断します。

演習問題

演習 2-1

二つの整数値を読み込み、
前者の値が後者の何パーセントに相当するかを表示するプログラムを作成せよ。

解答例

プロジェクト名:chap2-2-2 ソースファイル名:chap2-2-2.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int x, y;

    puts("二つの整数を入力してください。");
    printf("整数 x:"); scanf("%d", &x);
    printf("整数 y:"); scanf("%d", &y);

    printf("x の値は y の %d%% です。\n", x * 100 / y);

    return 0;
}

この記事の内容を理解できれば、
C言語の計算処理の土台はほぼ完成 です 👍
次は、演算の優先順位や型との関係を見ていくと、
「なぜその結果になるのか」が、さらにクリアになります。