Objective-C Primer 番外編 徹底C復習 4.制御文その1


この回では while文、do-while文、continue文、break文の説明をしています。switch文、for文は「制御文その2」を見て下さい。 05/09/22:00

なおサンプルコードは2007/5/9/17:30に更新されています。



制御文
Objective-Cの制御文はCの制御文とまったく同じです。


1. if 文
viva cocoa ホームページから「Objective-C」→「C言語予約語一覧」と進んで、「if」の説明をご覧になってください。


2. while 文
 サンプルコードを通じて説明します。なお、サンプルコードは control.zip からダウンロードすることもできます。



while.m
d0122908_22205478.gif

コード説明
ソースファイルの拡張子が「.m」になっている点に注意してください。このファイルはすでにObjective-Cのソースファイルです。
1行目でBOOLというObjective-Cで定められた真偽値型を使うためにヘッダファイルを読み込んでいます。
2行目でprintf関数とscanf関数を使うためのヘッダファイルを読み込んでいます。
5行目でBOOL型の変数chを宣言し、6行目で1という整数で初期化しています。
7行目がwhile文です「( )」の中の式が「真」であれば、続いて「{ }」の間の式を実行してまたこのwhile文に戻ってきます。もし「( )」の中が「偽」であれば、「{ }」の間の式は無視されて(飛ばされて)次に進みます。
8行目のprintf関数については viva Cocoa ホームページの「Objective-C」→「第5回 NSLog、、、」の説明を見て下さい。NSLog関数はprintf関数とほぼ同じ働きをします。printf関数がNSLog関数と違うところはprintfが文字を出力する前に自動で改行することと「@」という識別子が使えないという2点だけです。
10行目のscanf関数はコンソール(ターミナル)に打ち込まれた文字(文字列)を第1引数で指定したフォーマット(書式)で(この例の場合は10進数の整数で)、第2引数で指定した変数に(この例の場合は「ch」)に代入するという関数です。第2引数の変数名の前にアンバサンド「&」が必要になることに注意してください。

d0122908_23164530.gif

ターミナルでのコマンド説明
while.mファイルがデスクトップのvivacocoaフォルダに保存されていると仮定しています。
cd Desktop/vivacocoa
   cd は移動しろというコマンドです。
cc while.m -framework Foundation
   コンパイルを命じています。「-framework Foundation」というオプションが必ず必要です。
./a.out
   でき上がったa.outという実行ファイルを起動しています。a.outの前にカレントディレクトリを意味する「./」が必要です。

「数字を入力してください : 」と促されたら色々な数字を入力してみましょう。

必ず半角の整数値を入力してください。全角の数字は文字と見なされます。小数点を含む数字や空欄を含む数字および文字や文字列を入力するとこのプログラムは暴走します。その場合は「コマンド + Q」か「ターミナル」メニューの「ターミナルを終了」で終了させてください。


128と入力すると-128となり、129と入力すると-127と返ってきます。このことについては第3回データ型を参考にしてください。結局0という数字以外はすべて「真」として評価されていることが分かります。終了するには0になる数字を入力します。例えば0そのもの、あるいは256、512などです。
 なお、trueは真、falseは偽という意味です。


3. do-while 文
先ほどの「while.m」の6行目「ch = 1;」という式を削除してからコンパイルして実行してみてください。いきなり「0はfalseです。お疲れさまでした。」とプログラムは終了すると思います。これはBOOL型が宣言と同時に実際には0に初期化されているからです。このままだと while文の中身は一度も実行されることなくプログラムは次に進んでしまい、while.mの場合だとそのまま終了してしまいます。このような場合にも「取りあえず一度だけは中身を実行したい場合」に用いられるのが、do-while文です。

doWhile.m
d0122908_133318.gif

コード説明
6行目、「ch = 1;」を「//」でコメント化して無効にしています。当然削除してもらっても結構です。
7行目、「while( 〜 )」で始めるところをまず「do」ではじめます。これで続くブロック文( { と } で囲まれた文・式 )を取りあえず実行することになります。
11行目、ブロック文の終わり( } )に続いて「while ( 〜 )」と繰り返しを継続するかどうかの条件を ( ) の中に記述します。この条件に合えば7行目の「do」に戻ることになります。条件に合わなければ次の行へとプログラムは進んで行きます。なおこの11行目で「while( 〜 )」の後にセミコロン「;」が必要なことに注意してください。

実行画面

d0122908_14294780.gif

いきなり「0 はtrue です」となりますが、これはdo-whileで取りあえず1度はブロック文を実行しているからです。後の操作はwhile.mと同じです。この例ではdo-while文の利点をあまり感じないでしょう。また実際にwhile文のほうが使う頻度は高いと思います。do-while文は後ほどの「クラス」のサンプルコードで使われています。do-while文の深い理解はその時にするとして、while文だけは確実に理解しておいてください。


4. continue 文
まずはサンプルコードを見て下さい。

continue.m
d0122908_17591064.gif

コード説明
1行目、このファイルは「Foundation.h」というヘッダファイルは読み込んでいません。まったくCのままのソースファイルですが、一応拡張子を「.m」としてObjective-Cのファイルとしています。
4行目から7行目、main関数の中で使う4つの変数を宣言しています。int型の2つは宣言と同時に0で初期化していますが、処理系の仕様として(C言語の仕様ではなく、この場合はgccというコンパイラの仕様によって)初期化せずとも宣言した時点で0で初期化されるみたいです。しかし一応初期化するクセをつけておいたほうが良いでしょう。
10行目、while文の評価式の中が数字の1です。1は定数(直定数)です。変数と違い変更することはできません。そして1は「真」として評価される数字です。つまりこのwhile文は永遠に繰り返される無限ループです。
直定数については viva Cocoa ホームページ→「Objective-C」→「第4回〜」の「リテラル定数」の項を参考にして頂ければ助かります。
11行目と19行目の複合代入演算子は viva Cocoa ホームページ→「Objective-C」→「第7回〜」の「Column」(ページの最下段)を参照してください。
17行目に今回の課題の「continue」文が記述されていますが、まずは実行してみましょう。

実行画面

d0122908_19581093.gif

今回の「continue.m」の中身はまったくのC言語のままです。コンパイル時も「-framework Foudation」というオプションを付けなくても問題なくコンパイルされます。

足し算を行う場合は半角英子文字で「y」、行わない場合は「n」と入力します。
「はい」の場合と「いいえ」の場合の動きを比べてください。どちらの場合も足す数は毎回10ずつ増えていきます。これはループ自体は毎回行われていることを表しています。しかし「いいえ」を選んだ場合は「合計」には加算されていません。これは17行目の「continue」文でその回のループ処理は中断してループの最初に戻ることにしているからです。「continue;」と記述すれば、それ移行の処理を中断してループの始めに戻ります。

しかしこのままでは、このプログラムを終了する方法がありません。コンソール(ターミナル)に用意されている強制終了コマンドを使います。「Control + C」もしくは「コマンド + .(ドット)]
を押します。この方法ですと今ターミナル上で走らせているプログラムを強制的に終了します。ターミナルじたいは終了しません。あるいは「2.while文」で試した「コマンド + Q」を押すか、「ターミナル」メニューら「ターミナルを終了」を選んでこのプログラムをターミナルごと終了させる方法もあります。



5. break 文
まずはサンプルコードを見て下さい。

break.m
d0122908_1527463.gif

コード説明
18行目で「もし押されたキーが'q'なら」というif文を記述して
19行目で break; と記述しています。
break;と記述すれば、その時点で強制的にループを終了します。このサンプルの場合ですとループの終った26行目の処理が開始されることになります。

実行画面

d0122908_21474716.gif

前回の「continue.m」との相違点は、このプログラムを終了するために「q」というインターフェイスが増えた点だけです。色々と試してみて、終了したい時には「q」とタイプしてみてください。「お疲れ様でした」と表示されてプログラムは正常終了します。
[PR]
by vivacocoa | 2007-05-01 15:28


<< Objective-C Pri... Objective-C Pri... >>