連載
» 2014年06月11日 10時00分 UPDATE

完全マスター! 組み込みC言語プログラミング(5):【問題4】Cコンパイラはif文をどう裁くのか (1/2)

C言語を使ったマイコン制御プログラムの“イロハ”を解説する本連載。今回はif文を用いて、入力値が奇数であるか偶数であるかを表示するプログラムに挑戦します。

[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]
完全マスター! 組み込みC言語プログラミング

 本連載では、これから組み込みシステムのプログラミングを学びたい人向けに、C言語を使ったマイコン制御プログラムの“イロハ”を解説していきます。

 毎回少しずつステップアップしていけるよう、本文の最後で問題を出し、次回その解答を解説していく形式です。

 では、前回の問題を振り返ってみましょう。



問題4「入力された値の中から最大値を表示」

前回の宿題(問題4):

整数を入力し、それが奇数であるか偶数であるかを表示するプログラムを作成してください。


 問題4は、入力された数が奇数か偶数かを表示する双岐選択(IF THEN ELSE型)の基本的な問題です。それでは解答を発表しましょう。


#include <stdio.h>
int main(void)
{
    int n, m;
    printf("整数を入力してください->");
    scanf("%d", &n);
    m = n % 2;
    if (m != 0) {
        printf("奇数です。\n");
    }
    else {
        printf("偶数です。\n");
   }
}
 
プログラム1 「oddeven.c」

 今回のプログラムはif文が1つだけの簡単なものです。これを実行すると、10が入力されたときは「偶数です。」と表示され、5が入力されたときは「奇数です。」と表示されます。

図1 図1 「oddeven.c」を実行

課題4の解説とif文の応用

 奇数とは2で割り切れない数、偶数とは2で割り切れる数のことをいいます。ですから問題4のプログラムは入力された数を2で割ってその余りを求め、余りが0でなければ奇数、余りが0ならば偶数とすればよいのです。

 フローチャートは次のようになります。

図2 図2 「oddeven.c」のフローチャート

 さて、今回もif文について解説したいと思います。

 前回、「if文の構文規則は以下のようになっており、if文の式に書かれた条件が満たされる場合は最初の文(1)を実行。条件を満されない場合はelseに続く文(2)を実行します」と述べました。

if(式)文(1)else文(2)

または

if(式)文(1)



 プログラム言語としての理解であればそれで十分なのですが、C言語のif文は「式の値が0と比較して等しくない場合は文(1)を実行し、式の値が0と比較して等しいならば文(2)を実行する」が正しい意味になります。組み込みC言語ではこのように理解しておきましょう。

 すると、oddeven.cのif文は次のように書くこともできます。

if (m) {
        printf("奇数です。\n");
}
else {
        printf("偶数です。\n");
}

 さらに、変数mを使わないのであれば、

if (n % 2) {
        printf("奇数です。\n");
}
else {
        printf("偶数です。\n");
}

と書けますし、さらに奇数は2進数で考えると1の位(20の位)が必ず1になることを応用して、

if (n & 1) {
        printf("奇数です。\n");
}
else {
        printf("偶数です。\n");
}

とも書けます。

 アンパサンド(&)はビット単位のAND演算子で、プログラム例では1とAND(論理積)することで2進数の1の位以外のビットを全て0クリアしています。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.