第一章:基礎知識
5.制御文
ある変数の値が指定の数字の場合に処理を分けたいという場合があると思います。そこで利用されるのがif文です。文法は次の通りです。
int x=0; if(x==0) { x=1; }else{ x=0; }
if文は if(条件){成立したときの処理}else{成立しなかったときの処理} という文法で入力します。条件は、比較式を入力します。比較式で利用する記号を比較演算子と呼びます。
== 左右の値が同じ
!= 左右の値が違う
< 左の値が右の値より小さい
> 左の値が右の値より大きい
<= 左の値が右の値より小さいか同じ
>= 左の値が右の値より大きいか同じ
これらの比較演算子を使って条件を組み立てます。
上のサンプルの例では、xが0かどうかを調べています。サンプルではxは常に0なので、成立しなかった場合の処理(else)は実行されません。xが0の場合の処理だけを書きたい場合は、else以降は記入しなくても問題ありません。
bool型とはfalseかtrue(0かそれ以外)を表現する変数です。VCLコンポーネントでは機能のオンオフによく利用されています。
int x; x=2<10; Caption = x;
この例では2<10の比較結果をxに代入してそれをCaptionに表示しています、ここの例では、2は10より小さいので、結果はtrueなのですが、Stringクラスにbool型を直接読み取る機能が無いため、int型に代入しています。bool型は0か1のどちらかの値なので、整数型であるためint型に格納出来ます。
int x=0,y=0; if(x==0) { if(y==0) { x=1; } }
この表記も許されます。
{ }の中に{ }を何重にも組み合わせることをネスト(入れ子)といい、この階層があまり深くなるようなプログラムは読みにくくなるので書くべきではありません。
しかし、何重にもしなければ比較式が足りないという事もあるかもしれません。こういったときは次のように書くことも出来ます。
int x=0,y=0; if(x==0 && y==0) { x=1; }
条件が2つ書かれて、間に&&という表記が追加されました。これは、左右の条件式が成立している場合のみ、成立しているとみなし、どちらか片方でも成立していなければ成立していないと判断する論理演算子です。
これと同じような役割をするのが、|| と ! です。||は条件のどれか一つでも成立していれば、成立していると見なす演算子です。
int x=0,y=0,z=1; if(x==0 || y==0 || z==0) { x=1; } if(!(x==0)) { こちらは実行されない }else{ こちらが実行される }
この上の例では、zの値は成立していませんが、||で論理演算しているので、他のxかyのどちらかが成立していれば成立しているとされます。
下の例ではx==0は成立していますが、(x==0)の前に!が付いているので、結果が反転して0になります。( )が必要になる理由は、!x==0とすると、演算子の優先順位により、xが反転した値になり、xは1になるので、1==0という比較式になってしまいます。ここでは比較する値が0なので問題は特にありませんが、別の数字と比較する場合に問題になるのでx==?を比較するために( )で先に比較する必要があります。
&&は、1&&1 の時のみ1を返す
||は、0||0 の時のみ0を返す
!は、演算結果を反転させる(0以外を0に、0を1にする)
最初の条件に適合しなかった場合、別の比較式で比較したいという事があります。そう言う場合は、else{ }の中にif文を書いて、さらに適合しなかったらその中のelse{ }にif文を書いて…などとやっているとネストが深くなって読みづらくなります。こういう場合の記入方法があります。
if(x==0) { }else if(y==0){ }else{ }
else の { の前にif文を追加する形の else if という形式です。これを利用することで、階層が深くなるのを防ぐことが出来るようになります。
ある変数の値がいくつかの値の場合に処理を分けるにはif文では条件ごとにif文を用意しなければなりませんでした。以下の例はxの値が1か2か3の時に処理を分けるif文です。
if(x==1) { }else if(x==2){ }else if(x==3){ }
このような書き方をしてもいいのですが、もう少し便利な方法があるので紹介します。
それがswitch文です。上の例をswitch文に置き換えた物が下のサンプルになります。
switch(x){ case 1: ここに処理を書きます break; case 2: ここに処理を書きます break; case 3: ここに処理を書きます break; }
このようにswitchの隣の括弧の中の変数の状態によってcaseごとに振り分けられます。
xの値が1の場合、case 1:にジャンプします。そしてcase ?とbreak;の間にある処理を実行して、break;命令でswitch文から抜け出します。次はbreak;が無い場合を説明します。
switch(x){ case 1: 処理 case 2: 処理 break; case 3: 処理 }
となっていた場合、case 1にジャンプすると、直下の処理を実行した後に、case 2:の処理も実行し、その後break;によってswitch文を抜け出します。case 2:は普通にbreak;まで実行して終わりです。case 3にもbreak;がありませんが、switch文の終わりの}があるので、case 3:の処理が終わると、そのままswitch文を終わります。
switch文の(x)の中に利用できる変数は整数のみです。