C++ 基礎
首都大学東京 田川研究室
戻る

制御構文

以下、いろいろ察してください。
#include <stdio.h>
int main()
{
    int ia;
    
    ia = 2;
    if(ia < 3)
        printf("ia は3より小さい\n\n");

    if(ia < 1)
    {
        printf("ia は1より小さい\n\n");
        ia = 0;
        printf("ia を1に修正\n\n");
    };


    if(ia < 1)
    {
        printf("ia は1より小さい\n\n");
        ia = 0;
        printf("ia を1に修正\n\n");
    }
    //ブロック{}の終わりに限り、;を省略可。


    if(ia == 1)
    {
        printf("ia は現在1ですね\n\n");
    }
    else if(ia == 2)
    {
        //直前のifが成り立たない場合、これを試せる
        printf("ia は現在2ですね。\n\n");
    }
    else if(ia != 4)
    {
        printf("ia は現在4では無いですね。\n\n");
    }
    else
    {
        //全部成り立たなかった場合。
        printf("ia は現在4ですか?\n\n");
    }

    //以下、間違った文
    //これでもコンパイルは通る。バグとなるので気をつけてください。
    if(ia = 0)
    {
        printf("ia は現在0ですね\n\n");
    };
    return 0;
}
制御構文で重要なのは、条件式と{}によるブロック化ですね。ifの()の中に、条件式を不等号やらで書きます。それが満たされた場合、直後の命令を実行します。複数の命令をifで制御したい場合、上記のように{}でまとめてブロックとします。

ここでひとつ特殊なのが、3つめです。等しいという意味を示すには=ではなく==を用います。=は代入、つまりメモリ転送を意味する演算子です。==は左右を比較する比較演算子です。どちらでもコンパイルでき、一応動きますが動作は謎ですので気をつけてください。
ループを作りましょう。繰り返し処理というのはプログラムにおけるもっとも重要な機能です。ループを記述できない言語はプログラム言語とは呼べないでしょう。
#include <stdio.h>
int main()
{
    int ia;
    int sum;
    
    ia = 0;
    while(ia <= 100)
    {
        sum = sum+ia;
        ia  = ia + 1;
    };
    printf("sum = %d\n" , sum);
    
    return 0;
}
↑がもっとも基本的な繰り返し構文です。whileは訳せば~までの間という意味ですので、()の中の条件式が満たされている間、直後に書かれた命令を繰り返します。通常{}でブロックを実行させるでしょう。

ia = ia + 1;

を書かないと無限ループとなるので気をつけましょう。意図的に無限ループとする場合、
#include <stdio.h>
int main()
{
    int ia;
    int sum;
    
    ia = 0;
    while(1 < 2)
    {
        sum = sum+ia;
        ia  = ia + 1;
        if(ia == 100)
        {
            break;//ループを1段抜ける構文;
        }
    }

    ia = 0;
    while(true)
    {
        sum = sum+ia;
        ia  = ia + 1;

        if(ia == 100)
            break;//実行すべき命令が1つの場合、ブロックでなくてもかまわないif文の例。
    }
    printf("sum = %d\n" , sum);
    
    return 0;
}
1<2は常に成り立つので無限ループとなります。しかし、本当の意味で無限ループなんていうのは使わないので、ループを抜けるための別口が必要になります。そこで、break文です。

break
ループを1段抜けます。

1<2をわざわざ書くのも面倒で、ぱっと見たときに何を意味するのかわからないので、Cでは以下の値が用意されています。上記二つのループはまったく同じ動作をします。
true
条件式が常に成り立つことを意味する仮想的な文。
false
条件式が常に成り立たないことを意味する仮想的な文。
複合条件式を以下に示します。
#include <stdio.h>
int main()
{
    int ia;
    int sum;
    
    ia  = 0;
    sum = 2;
    if(ia == 0 && sum < ia)
        printf("iaは0で、sumはiaより小さいです。");
    

    if(ia >= 0 || sum >= 0)
        printf("ia、sumのどちらかが0以上です");
    return 0;
}
&&は両方、||は片方が成り立つときに条件式が真になります。複合条件式を多用するアルゴリズムは私は好ましくないと思います。見直すべきです。
制御構文は見た目で覚えるのも大事ですが、動作も覚えておくのが良いと思います。基本は直後の命令、あるいは命令ブロックを実行するだけです。ここで紹介した制御構文は全体の3割りくらいですが、これでしばらく十分だと思います。