スッキリわかるJava入門 第3章 条件分岐と繰り返し
●構造化定理
・どんなに複雑なプログラムでも、順次・分岐・繰り返しの3つの制御構造を組み合わせれば作成することが可能なことが数学的に証明されている。
●制御構文の構成要素(if文、while文など)
・[条件式]分岐条件や繰り返しを続ける条件を示した式。
・[ブロック]分岐や繰り返しで実行する一連の分の集まり。
・分岐の構文
if (条件式) {
ブロック
} else {
ブロック
}
・繰り返しの構文
while (条件式) {
ブロック
}
●ブロックの書き方
・ルール1:波カッコの省略
内容が1行しかなければ、波カッコを省略しても構わない。
⇒実際の開発現場では、プログラミングのミスを防止するため、このようなブロックの波カッコを省略することは推奨されない。
・ルール2:ブロック内で宣言した変数の寿命
ブロック内で宣言した変数は、そのブロックが終わると同時に消滅する。
⇒変数が利用可能な場所の範囲をスコープ(scope)と言う。
●条件式の書き方
・関係演算子:==,!=,>,<,>=,<=
・関係演算子も、算術演算子(+など)や代入演算子(=)と同じ演算子の仲間であるため「評価されて化ける」という特性を持っている。
⇒関係が成立するならtrue(真)に、そうでないならfalse(偽)に化ける。
if(age >= 18){ ⇒age=25
↓評価 ⇒手順①:条件式を評価して変形する。
if( true ){ ⇒手順②:評価結果を見て実行すべきブロックを判定する(trueなので直後のブロックを実行)。
・if文:条件式の評価結果がtrueなら第1ブロック、falseなら第2ブロックを実行する分。
・while文:条件式の評価結果がtrueなら、ブロックを繰り返し実行する文。
・条件式のルール:if文やwhile文で用いる条件式は、評価結果がtrueまたはfalseになる式でなければならない。
●文字列の比較
・Javaでは条件式の中でString型の変数や文字列を比較する場合には、特別な書き方をする必要がある。
・Javaのルールでは文字列の比較は"=="ではできないことになっている
・if(s == "夕日"){ ⇒NG(コンパイルエラーは起きず、実行できるけど変な動きをする)
・if(s.equals("夕日")){ ⇒OK
●論理演算子の書き方
・論理演算子
・&&:かつ(両方の条件が満たされた時にtrue)
if(age >= 18 && gender == 1){ ⇒もし ageが18以上 かつ genderが1なら
↓評価 ↓評価
if(true && false ){
↓評価
if(false ){
・||:または(どちらか片方の条件さえ満たされればtrue)
if(name.equals("鈴木") || married == true){ ⇒もし nameが鈴木 または marriedがtrueなら
↓評価 ↓評価
if(true || false ){
↓評価
if(true ){
・例)ageが18以上 かつ genderが1 または ageが16以上 かつ genderが0
if(age >= 18 && gender == 1) || (age >= 16 && gender == 0){
●否定演算子
・!=:もし~でないならば
右にあるtrueやfalseを逆転させる演算子
if( ! (age >= 18) ){ ⇒もしageが18以上でない(18未満)ならば
↓評価
if( ! true ){
↓評価
if( false ){
●3種類のif構文
・if-else構文:基本形。
・ifのみの構文:条件が満たされなかった場合、何もしない。elseを省略。
・if-else if-else構文:もし条件が満たされなかった場合、別の条件(if-else)で評価する。
①else ifブロックは複数記述できるが、ifブロックより後ろ、elseブロックより前にだけ記述できる。
②最後のlseブロックは、中身が空ならばelseごと省略が可能。
●switch文による分岐
・switch文に書き換えできる条件
①すべての条件式が「変数 == 値」や「変数 == 変数」のように左辺と右辺が一致するかを比較する式になっており、それ以外の「>」や「<」あるいは「!=」などが使われていない。
②比較する値が整数(byte型、short型、int型のいずれか)または文字(char型)であり、少数や文字列ではない。
③
・switch文記述の際の注意点
・switchの直後に書くのは、条件式ではなく、変数名。
・caseの横には値を書き、その後ろにはコロン:を記述する。
・case以降の処理の末尾には忘れずにbreak文を記述する。
・default:(デフォルトラベル)は、それ以外の処理が不要な場合は省略可能。
・break文を書き忘れると?
・switch文は「条件に一致するcaseラベルまで処理をジャンプさせる命令」にすぎない。
・break文で明示的に「処理を中断してswitch文を抜ける」という指示がない限り、制御構造「順次」に従って次のcase文へ処理が進んでしまう。
switch ( fortune ) {
case 1: ⇒fortuneが1か2なら…
case 2:
System.out.println("いいね!");
break;
●2種類のwhile文
・while文:ブロックを実行する前に条件式を評価(前置判定)
⇒初めから条件式の判定結果がfalseだった場合は、1度もブロックが実行されない
while (条件式) {
ブロック
}
・do-while文:ブロックを実行した後に条件式を評価(後置判定)
⇒最低1回はブロックを実行
do {
ブロック
} while (条件式);
●for文
・各部の意味
for( ① ; ② ; ③ ){ ⇒例)for( int i = 0 ; i < 10 ; i++ ){
ブロック
}
①初期化処理:
・for文による繰り返しが始まるにあたり最初に1回だけ実行される文。
・何週目のループかを記録しておく変数を定義。
・このような変数をループ変数と言う。
②繰り返し条件
・ブロックの内容を実行する前に評価(前置判定)され、このループを継続するか否かを判定する条件式。
・評価結果がtrueの間は"{"以降のブロックが繰り返し実行される。
③繰り返し時処理
・for文内のブロックを最後まで処理して、"}"まで到達した直後に自動的に実行される文。
・通常は「i++」のようにループ変数を1増やす文を書く。
・ループ変数のポイント
①ループ変数の名前は自由:
・for文より前に、すでに宣言されている変数名は使えない。
・一般的には1文字程度の短い変数名が選ばれることが多い。
②ブロック内で利用可能:
・ループ変数も通常の変数の一種であるため、ブロック内での計算や表示に使える。
③ブロック外では利用不可能:
・ifブロック内で宣言した変数がブロック外では使えないように、ループ変数もfor文のブロック内でのみ有効。
●繰り返しの中断
・break文:
・繰り返し自体を中断
・breakを囲んでいる一番内側の繰り返しブロックが即座に中断される
・continue文:
・今回の周だけを中断し、次の周へ
●無限ループ
・強制停止されない限り永遠に繰り返しを続ける制御構造
・無限ループを意図的に作るには
・while (true) { 処理 }
・for (;;) { 処理 }