C言語のきほん|算術演算子の使い方

足し算・引き算だけじゃない。C言語の算術演算子を使いこなして、計算の落とし穴も一緒に防ごう。

C言語でプログラムらしい処理を作るうえで、いちばん基本になるのが「数値の計算」です。
その計算を支えるのが 算術演算子 です。

算術演算子を使うと、

  • 合計や差を出す
  • 掛け算や割り算をする
  • 余りを使って偶数・奇数を判定する
  • マイナスを付けたり符号を反転したりする

といった処理が書けるようになります。

ただし、算術演算は「書けたら終わり」ではなく、C言語特有の注意点もあります。
特に 整数の割り算ゼロ割、それから 演算の順序(優先順位) は、入門の段階でしっかり押さえておくと安心です。

ここでは、2項演算子(+ - * / %)と単項演算子(+ -)を中心に、使い方と注意点をやさしく丁寧に解説していきます。

算術演算子は2種類ある

算術演算子は、オペランドの数で大きく2種類に分かれます。

  • 2項演算子:2つの値で計算する(加減乗除や余り)
  • 単項演算子:1つの値を操作する(符号の反転など)

2項の算術演算子

2つの値を使って計算する演算子です。まずは一覧で押さえましょう。

演算子演算意味
+加算a + ba と b を足す
-減算a - ba から b を引く
*乗算a * ba に b を掛ける
/除算a / ba を b で割る
%剰余a % ba を b で割った余り
  • / は整数でも小数でも使えます。
    % は 整数だけ に使えるのが大事なポイントです。

+(加算)

  • は足し算です。整数にも小数にも使えます。
int result = a + b;

合計金額、合計点、合計時間など、使う場面はたくさんあります。

-(減算)

  • は引き算です。整数にも小数にも使えます。
int result = a - b;

差分、残り、変化量を出すときに使います。

*(乗算)

  • は掛け算です。整数にも小数にも使えます。
int result = a * b;

単価×個数、幅×高さなどの計算でよく使います。

/(除算)

/ は割り算です。整数にも小数にも使えます。
ただし、ここで重要な注意点があります。

整数同士の割り算は小数が切り捨てられる

たとえば 10 / 4 は本当は 2.5 ですが、int 同士だと結果は 2 になります。

int a = 10;
int b = 4;
int q = a / b;   /* qは2 */

小数まで欲しいときは、どこかを double にする必要があります。

double q = (double)a / b;  /* 2.5 */

この違いは、初心者が一番びっくりしやすいポイントなので、早めに体感しておくのがおすすめです。

%(剰余)

% は割り算の余りを求めます。
これは 整数でのみ使用可能 です。

int r = a % b;

余りは、偶数・奇数判定や、周期的な処理(7日周期、60秒で繰り上がりなど)でよく使います。

例として、偶数なら余りが0になります。

n % 2 == 0

単項の算術演算子

単項演算子は、1つの値に作用します。算術系では次の2つがあります。

演算子演算意味
-符号反転-aa の符号を反転する
+何もしない+aa をそのまま扱う

単項 -(符号を反転する)

単項の - は、値の符号をひっくり返します。

  • 10 → -10
  • -5 → 5
int a = 10;
int b = -5;
int r1 = -a;  /* -10 */
int r2 = -b;  /* 5 */

単項 +(ほぼ何もしない)

単項の + は値をそのまま扱います。
実務ではあまり出番はありませんが、「ここは正の値として扱っているよ」と明示したいときに使われることがあります。

int r = +a;

算術演算で気をつけたいこと

算術演算子自体はシンプルですが、実際のプログラムでは次の注意点がとても大事です。

ゼロ割に注意する

割り算で b が 0 だと、ゼロ割になります。
プログラムが停止したり、実行環境によっては例外になったりします。

a / b
a % b

この2つは、b が 0 のときに危険です。
入力を受け取るプログラムでは、割る前に 0 かどうかチェックする癖をつけると安心です。

整数の割り算は切り捨てになる

これは先ほどの通りですが、学習中に何度も出ます。

  • 10 / 4 は 2
  • 10 % 4 は 2(余り)

「小数が欲しいなら double へ」という考え方が大事です。

演算の順序(優先順位)に注意する

算術演算には優先順位があり、基本的に

  • / % が先
  • + - が後

です。

例として、

int result1 = 5 + 2 * 3;

は掛け算が先なので 11 になります。

一方で、

int result2 = (5 + 2) * 3;

は括弧が先なので 21 になります。

複雑になったら、括弧で意図を明確にするのが一番安全です。

サンプルプログラムで算術演算子を体験しよう

「整数の割り算が切り捨てになる」点と「ゼロ割チェック」も入れたサンプルプログラムです。

ファイル名:6_2_1.c

#include <stdio.h>

int main(void)
{
    int a, b;

    printf("2つの整数を入力してください\n");
    printf("a > ");
    scanf("%d", &a);
    printf("b > ");
    scanf("%d", &b);

    printf("\n計算結果(2項演算子)\n");
    printf("a + b = %d\n", a + b);
    printf("a - b = %d\n", a - b);
    printf("a * b = %d\n", a * b);

    /* ゼロ割を防ぐ */
    if (b != 0) {
        printf("a / b = %d\n", a / b);
        printf("a %% b = %d\n", a % b);

        /* 小数も見たい場合の例 */
        printf("a / b を小数で見ると = %.2f\n", (double)a / b);
    } else {
        printf("b が 0 なので、割り算と余りは計算できません\n");
    }

    printf("\n計算結果(単項演算子)\n");
    printf("-a = %d\n", -a);
    printf("+b = %d\n", +b);

    return 0;
}

実行例(入力が a=10, b=4 の場合)

2つの整数を入力してください
a > 10
b > 4

計算結果(2項演算子)
a + b = 14
a - b = 6
a * b = 40
a / b = 2
a % b = 2
a / b を小数で見ると = 2.50

計算結果(単項演算子)
-a = -10
+b = 4

サンプルプログラムの解説

% を表示したいときは %% を使う

printf の書式では、% は変換指定の始まりなので、% 自体を表示したいときは %% と書きます。

printf("a %% b = %d\n", a % b);

これで a % b の計算結果が表示できます。

a / b と (double)a / b は意味が違う

printf("a / b = %d\n", a / b);
printf("a / b を小数で見ると = %.2f\n", (double)a / b);

上は int の割り算なので切り捨て、下は double が混ざるので小数になります。
同じ a と b でも、型が変わると結果の見え方が変わるのがポイントです。

ゼロ割は先に防ぐ

if (b != 0) {
    /* 割り算OK */
} else {
    /* 0なので計算できない */
}

入力を受け取るプログラムでは、これはかなり大事な安全対策です。

演算の順序は括弧で明確にする

算術演算は優先順位があるので、複雑な式は括弧で意図を見せるのがおすすめです。

  • 5 + 2 * 3 は 11
  • (5 + 2) * 3 は 21

「読む人にも自分にも優しいコード」にするために、括弧は遠慮なく使って大丈夫です。