制御文

概要
本章ではプログラムを構成する基本的な要素のひとつである制御文について解説する.
目次

制御文とは

制御文とは,プログラムの流れを制御するためのものだ.例えば,変数 a の中身によって実行されるコードを変化させたい場合は if 文とか switch を使う.何度も同じコードを実行したい場合は for や while である.以下では C++ の重要な制御文について解説する.

if文

最初に,基本的な制御文である if を用いたプログラムの書き方について解説する.

if

文字どおり「もし**なら」という条件で,処理を変える.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
if(条件)

  {1;2;

    ...

  }

条件が真(零以外)ならば,文1,文2,...が実行される.

処理が文1だけの場合,中括弧(\{)は省略することもできる.

if 処理の流れ
if 処理の流れ

if-else

ifだけでは条件に合致しなかった場合,文1や文2が処理されず飛ばされるだけだが,場合によっては if の条件に合致しなかった時は別の処理をしたい.その時は if-else を用いる.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  if(条件)

  {1;2;

    ...

  }

  else

  {3;4;

    ...

  }

この場合,ifの条件に合致しなかった場合は文3,文4が実行される.反対にifの条件に合致した場合は,文3,文4は実行されない.

if-else 処理の流れ
if-else 処理の流れ

また,elseに分類された中でさらに分岐させたい場合は else if(条件) と書くこともできる.さらにifなどは入れ子にしても構わない.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  if(条件1)

  {1;

    ...

    if(条件2)

    {2;

      ...

    }

    else if(条件3)

    {3;

      ...

    }

  }

  else

  {4;

  }

例 if/if-else:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>

  using namespace std;

  int main(int argc, char**argv)

  {

    int a;

    cout<<"input a: "<<flush;

    cin>>a;

    if(a >= 10)

    {

      cout<<"a="<<a;

      if(a > 20)

        cout<<" :aは20より大きい"<<endl;

      else

        cout<<" :aは10以上だが20より小さい"<<endl;

    }

    else

    {

      cout<<"aは10より小さい"<<endl;

      cout<<"a="<<a;

      if(a >= 5)

        cout<<" :aは5以上の正の数"<<endl;

      else if(a<0)

        cout<<" :aは負の数"<<endl;

      else

        cout<<" :aは5より小さい正の数かゼロ"<<endl;

    }

    return 0;

  }

for文

ここでは繰り返しの処理を行う forループ について解説する.書き方はこうなる.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  for(初期設定式; 継続条件式; 再設定式)

  {1;2;

    ...

  }

具体例を見てみよう.

例 for:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>

  using namespace std;

  int main(int argc, char**argv)

  {

    int i;

    for(i=1; i<10; ++i)

    {

      cout<<i<<"回目の繰り返し"<<endl;

      cout<<"  i*i= "<<i*i<<endl;

    }

    return 0;

  }

この例では,初期設定式によりforループ内に入る前に変数iに1が代入される.そして,継続条件式の判定が行われ,満たされていればループ内の処理(この例では画面表示)が行われる.処理後に再設定式の処理が行われる.この例では ++i となっているがこれは i=i+1 の意味である.もちろん i=i+5 などでも構わず,1ずつ足さなければいけない訳ではない.そして,再設定式の処理が終わった後に継続条件式が満たされていれば,再びforループ内の処理が始まる.

forループの流れ
forループの流れ

while文

while

この while も繰り返しの処理を行うものであるが,forループよりも自分で設定しなければならない部分が増える.書き方は次の様になる.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  while(継続条件式)

  {1;2;

    ...

  }
while 処理の流れ
while 処理の流れ

このwhileでは先ほどのforのような,初期設定式と再設定式を記述する部分がない.したがって,必要があれば自分で書く必要がある.例えば,forの例と同じ処理をさせようとすると,次のように書く.

例 while:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>

  using namespace std;

  int main(int argc, char**argv)

  {

    int i=1;

    while(i<10)

    {

      cout<<i<<"回目の繰り返し"<<endl;

      cout<<"  i*i= "<<i*i<<endl;

      ++i;

    }

    return 0;

  }

do-while

同じ while でも do-while を用いると少し処理が変化する.書き方は次の様になる.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  do

  {1;2;

    ...

  } while(継続条件式);
do-while 処理の流れ
do-while 処理の流れ

whileとdo-whileの違いは「継続判定式の判定をどのタイミングで行うか」である.whileでは繰り返しループが始まる前に判定が行われ,do-whileでは繰り返しループの最後で判定が行われる.

これら2つの処理の流れを比べてみて,そのときそのときで便利な方を選択すればよい.

switch文

さて,再び分岐の構文に戻る. switch 文である.if-elseでは1つの条件文しか設定できないが,switchは同時に3つ以上の分岐をすることができる.書き方は次の通りである.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  switch()

  {

    case 定数式1:1;2; ... break;

    case 定数式2:3;4; ... break;

    ...

    case 定数式n:a;b; ... break;

    default:x;y; ... break;

  }

default はどのcaseにも分類されなかった場合の分岐を表す.defaultは省略することもできる.具体例を示す.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>

  using namespace std;

  int main(int argc, char**argv)

  {

    int a;

    cout<<"input a: "<<flush;

    cin>>a;

    switch(a)

    {

      case 1:

        cout<<"aの値は1です"<<endl;

        break;

      case 4:

        cout<<"aの値は4です"<<endl;

        break;

      case 8:

        cout<<"aの値は8です"<<endl;

        break;

      default:

        cout<<"aの値はなんだろう?"<<endl;

        break;

    }

  }

注意!

処理の部分の最後には 必ずbreak を書く必要がある.忘れると下にある処理も行われてしまう(breakの説明は後ほど).例えば,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  switch()

  {

    case 定数式1:1;2;

    case 定数式2:3;4; break;

    default:x;y; break;

  }

とした場合,「case 定数式1」に分類されると文1,文2の処理だけでなく文3,文4の処理まで行われてしまう.つまり,breakが出てくるまで下に下にと処理が継続される.

break / continue

break

switch の部分で出てきた break だが,一言でいうと break はループから抜ける記述である. while や for では継続条件式などで繰り返しが終了する条件を設定しているが, break があるとそれらは無視されて,すぐにループから抜ける.ループ内の以降の処理は行われない.

例 break:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>

  using namespace std;

  int main(int argc, char**argv)

  {

    int i=1;

    int a=4;

    while(i<15)

    {

      if(a>20)

      {

        cout<<"a="<<a<<"; aが20を超えたのでループを抜けます"<<endl;

        break;

      }

      cout<<i<<"回目の繰り返し; a="<<a<<endl;

      ++i;

      a*=2;

    }

    return 0;

  }

continue

次は continue だが,具体的には次のように用いる.

例 continue:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>

  using namespace std;

  int main(int argc, char**argv)

  {

    int i=1;

    int a=4;

    while(i<15)

    {

      cout<<i<<"回目の繰り返し; a="<<a<<endl;

      ++i;

      if(a>20)  continue;

      a=a*2;  // a>20 のとき,このコードは実行されない

    }

    cout<<"ループを抜けました; a="<<a<<endl;

    return 0;

  }

結果::

 1回目の繰り返し; a=4
 2回目の繰り返し; a=8
 3回目の繰り返し; a=16
 4回目の繰り返し; a=32
 5回目の繰り返し; a=32
 6回目の繰り返し; a=32
 7回目の繰り返し; a=32
 8回目の繰り返し; a=32
 9回目の繰り返し; a=32
 ループを抜けました; a=32

continueを読むとcontinue以下の処理が飛ばされる.ただし,breakと違って繰り返しなどのループから抜けることはない.例の場合だと,aの値が20以上になるとif分岐の条件を満たすので,continueを読む.そうするとそれ以降の処理,ここでは a = a * 2; だけだがこれが飛ばされ,繰り返しループの最後まで処理が終わった状態になる.そ

のあとはwhileで説明したとおり,継続条件の判定があって…と続く.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-30 (木) 07:17:07 (19d)