第三部 少し発展的なC言語

***もう少し詳しく文法***

ここでは第一部の時には説明しなかった基本的な制御構造について説明します。それはwhile、 do、switch、 goto、 break、 continueという予約語で定義された文です。

 

★while文とdo文について★

まずはwhile文によるループ制御について説明します。すでにループ制御に関してはfor文を説明しましたが、このwhile文もfor文と同じような使い方をします。

このwhile文は図3-1-1のような形で書きます。「判定式」が真である限り(0でない限り)実行文を繰り返します。もし仮に最初から「判定式」が偽ならば(0ならば)一回もループを実行せずにwhile文を抜けていきます。

図3-1-1

次にdo文の説明です。

この制御構造は予約語whileと一緒に用います。すなわち図3-1-2のような書式で使用するわけです。

do文の場合もwhile文と同じで「判定式」が真である限りループを実行しつづけますが、while文が一回もループを実行しないことがあるのに対してdo文の場合はとりあえず一回はループを実行します。

つまりループの判定をいつ行うのかが、この二つの制御構造では異なるというわけです。while文の場合はループの判定を先に行いdo文の場合は後に行います。

図3-1-2

★switch文について★

switch文はif文と同じで条件分岐を扱います。図3-1-3を見て下さい。

この図はswitch文を用いて西暦を元号に変換するプログラムです。このプログラムを見れば分かるようにswitch文は図3-1-4のような使い方をします。

この時注意すべきことはswitch文においてcase:の後に来るのは定数です。ここには変数は入らないので注意して下さい。

一般的にswitch文は図3-1-4のような形をしています。ここでbreakは後で説明する補助制御構造です。

図3-1-3

図3-1-4a

図3-1-4b

 

★gotoについて★

goto文はラベルをつけた場所に無条件で制御を移します。

ラベルとは例えばLoop:のようにラベルの後にコロンをつけて作ります。ラベルの名前(識別子)はどのようなものでも構いません。goto文を使う時はgotoの後にラベルを指定して使用します。

そうするとラベルのところまで制御が強制的に移されるわけです。

ただし、このgoto文は同じ関数内でしか効果がない事に注意して下さい。もし制御を他の関数に移したい時には広域ジャンプ関数というのを用いる事になります。

図3-1-5を見て下さい。このプログラムは最初に暗号を決めておきその暗号を指定するとプログラムが終了するというものです。

このプログラムの中でgoto文がどのように使われているのかというと入力された文字列が暗号と異なる時に制御をLoopに戻すという事を行っています。例えば暗号を「888」と決定し、次の入力で「999」とするとgoto文が実行されもう一度暗号の入力を促すわけです。

図3-1-5

 

★breakついて★

次にbreak文について説明します。

この制御構造は制御補助文(他にreturnとcontinueがあります。)と呼ばれており独立では意味をなしません。for、while、do、switch文から抜け出す時に使われます。

先ほどの暗号入力プログラムをこのbreakを用いて書くと図3-1-6になります。

ここでwhile(1)は無限ループを作るためのものです。(他にはfor(;;)などがあります)

またbreak文はif文の中で使われていますが、if文から抜け出すのではなくwhile文から抜け出します。また、仮にwhile文が入れ子構造を作っていたとするとbreak文は内側のwhile文から抜け出します。

図3-1-6

 

★continueについて★

continue文はbreak文と同じような使い方をします。図3-1-7A、Bを見て下さい。

この図はcontinue文がどのような制御を行うのかを示したものです。

break文の場合、制御をループの外に移しますが、continue文の場合はループの最後に移します。使い方はbreak文とほとんど変わらないので特に説明の必要はないと思います。

このプログラムはfor文を用いて変数 i と j をインクリメントしていくわけですが、i が偶数の時(これをi%2==0と表します)はcontinue文を使って制御を実行単位の最後に移しています。

そのためfor文を抜け出ると j は i の半分の値になっているわけです。

図3-1-7