前回(2020/07/10)の内容 条件分岐 (if 構文) 条件分岐 「複数の命令」の内、 「条件」によって、 その複数の命令の内の、「いずれか一つ」 を実行する仕組み => 命令を実行するかどうかの条件が記述できる <= 順接は、「問答無用」で実行される cf. 順接 : 命令を並べる事により、 複数の命令を、並べた順に、それぞれ実行する仕組み => 「記述量」がふえると、「実行量」が増える 与えれた状況に併せて、適切な対応を選択する仕組み プログラムの「柔軟性」を高める仕組み 「柔軟性」=>「汎用性」=>「再利用」 if 構文 : 条件分岐を実現する C 言語での表現方法 構文 : if ( 条件式 ) { then 節 条件が不成立時の文 } else { else 節 条件が成立時の文 } 条件式 : 真偽値(成立/不成立)を求める式 真 => 条件が成立 偽 => 条件が不成立 ( 成立しなかった ) 例: !strcmp ( A, B ) => A,B が同じ文字列なら真 例: 整数型の値や文字型の値は「比較」ができる ==, != (等しい、等しくない) <, >, <=, >= で、大小比較が可能 条件の成立時の文 条件が不成立時の文 : 複数の文(命令)が指定できる ( 空にする事も可能 ) 意味 「条件」が 『成立』した時に「条件の成立時の文」 を、 そうでない時には、「条件が不成立時の文」 を 実行する どちらか 一方だけ が実行される 「両方実行」も「両方不実行」も「無し」 「if 『文』」ではなく、 「if 『構文』」である理由 「『文』を対象として、『何かをする表現』」 なので「メタ表現」 文は、データを対象とする表現 構文は、文を対象とする表現 cf. 「順接」も「順接構文」 if 構文 アラカルト if 構文の基本 : if ( C ) { A } else { B } 「基本」は「基本の組み合せだけで何でもできる」ので秀逸 色々な組み合せ方を学ぶ必要がある => いかなる条件の判定も、(条件のサイズが有限なら) 基本の if 構文だけで、表現できる 二つの条件 C1, C2 の両方が成立した時に A、そうでない時に B という場合 # 基本の構文は、一つの条件しか確認できない # => 二つの条件 C1, C2 を、どのように利用するか ? 場合分け ( 真 : T / 偽 : F ) C1 C2 C1 と C2 の両方 T T T T F F F T F F F F # if 構文を利用すると、2 つの場合に分けられる # => if 構文数を N とすると、N+1 の状況が作れる 例: 引数の『文字(コード)』が数字かどうかを確認する (三つ目の if 構文を省略する場合の真偽表) 場合分け ( 真 : T / 偽 : F ) C1 C2 C1 と C2 の両方 T T T T F F F * F else 節の省略 else 節 : if 構文の 「else { B }」の部分 B が空の時は、 「else {}」としても良い が、 それを省略しても良い 基本: if ( C ) { A } else { } else 節の省略の場合: if ( C ) { A } /* else {} */ /* else 節を省略 */ then 節 ( { A } の所 ) は省略できない 基本: if ( C ) { } else { B } できない: if ( C ) else { B } if 構文の「入れ子」 if 構文の文の中に if 構文をいれる 複数の条件の「条件の組み合せ」を if 構文の組み合せで実現できる 例(複雑な条件) : ch が英大文字かどうか 'A' <= ch <= 'Z' [数学] => C 言語では、こう表現できません # 別の表現があるが、後期に話す 例 : if ( 'A' <= ch ) { /* ここでは、 「'A' <= ch」が成立している */ if ( ch <= 'Z' ) { /* ここでは「'A' <= ch」と「ch <= 'Z'」の両方が成立 */ /* ch が「英大文字」の時 */ } else {} } else {} [前回(2020/07/10) : 条件分岐 again ] 条件分岐 条件の可否によって、複数の命令の実行を選択できる 命令を組み合わせて新しい命令を作る仕組み ( cf. 順接 ) if 構文 C 言語で条件分岐を表現する仕組み 基本 : if ( C ) { A } else { B } => 基本の組み合わせ ( 入れ子 ) で任意の条件が判定可能 応用 else 節が省略可能 [2020/07/17] 複数条件の判定の内 ある値が複数の値をとりうる場合 例 : 入力される数値が、 1, 2, 3 の三通りある それぞれの場合に対して、別々の処理をしたい !! もし、取りうる範囲が 2 種類しかなければ、 !! if 構文一つで十分 例: それを 1 度しかやらないなら、すぐに手でやれ もし、2 度やるなら、どちらか悩んでください もし、3 度(以上)やるなら、プログラムを作って、PCにやらせろ 一般に N 通りの区別をするには、 else が N - 1 回深く もし、else の中身が、if 構文一つ場合 => else 節の {} を省略する else if 構文 (イデオム) else 節の文全体が一つの if 構文(入れ子)になっている場合 else 節のブレースを省略する 例: if ( C1 ) { A } else { if ( C2 ) { B } else { C } } => if ( C1 ) { A } else if ( C2 ) { B } else { C } 入れ子による、段の深化が防げる 複数の条件の関係が「視覚化」できます 入れ子 : 複数条件が適用されている else if : 一つのものに対する異なった条件が適用 一つのデータに対して、複数の条件の検査になっている 「表現」と「意味」の対応 (イデオム) 推奨しない if 構文の表現 その他の表現 いつでも、「基本」を守る事が肝要 自分で作成する時には、まずは、基本を守る 他人は、基本を守るとは限らないので、 いろいろな記法を学ぶ事も必要 ブレースの省略 then 節/else 節の文が一文の時にはブレースを省略できる !! 「本」には、 !! then/else 節には、「(一つの)文」が書ける !! 複数の文を書きたい場合は {} を使え !! 文が一つの場合は、{} を付けてもよい else if 構文は、その規則を特別な場合に適用している ブレース省略の是非 「省略」できるから、「手間」は減る (僅かな利点) 条件の適用範囲が不明瞭になる (大きな損失) 後から、変更を加える時に不便 (ミスの増大) ミスをしないためのちょっとした習慣(小さなコスト)が、 結果的に、大きなミス(多大な損害)を防ぐ事になります。 例 : {} を省略しない ぶら下がり構文の悲劇 ブレースの省略と else の省略が重なると悲惨 if ( C1 ) if ( C2 ) A else B は、次のどちらか ? (1) else が内側(後の/近い方の) if に対応 [正解] if ( C1 ) if ( C2 ) A else B if ( C1 ) { if ( C2 ) { A } else { B } } (2) else が外側(前の/遠い方の) if に対応 if ( C1 ) if ( C2 ) A else B if ( C1 ) { if ( C2 ) { A } } else { B } 1+2*3 => 1+(2*3) [switch 構文] switch 構文 条件分岐の表現方法の一つ !! if 構文は万能なので、なくてもよい 機能 多分岐構文 if 構文は 2 分岐だが switch 構文は n 分岐 構文 ::= switch ( <式> ) { } ::= の繰返し ::=