C プログラミング入門 総機1 (月1) 04: 式・条件分岐 (if) Linux にログインし、以下の講義ページ を開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/CPR1/ 2015-04-27 1 今日の内容 式 条件分岐 算術演算子 if-else 比較演算子 その他 2015-04-27 case-switch C プログラミング入門 総機1 (月1) 2 代入 (assignment) 代入演算子によって変数の内容を書き換える こと 変数の初期化と似ているが、区別されている #include <stdio.h> int main(void) { double x = 15, y = 10, s, m; s = x + y; m = s / 2.0; ... 2015-04-27 x, y を初期化 y x 15 s 10 m ?? ?? s, m を式の評価値で置き 換える(=代入) C プログラミング入門 総機1 (月1) 3 基本的な演算子 (operators) 代入演算子 a = 7 (変数 a の値を 7 に書き換える) x = (複雑な式) • 式の結果を x に代入する 2015-04-27 C プログラミング入門 総機1 (月1) 4 基本的な演算子 (operators) 四則演算子 x + 10 除算 乗算 y - z n * 1.5 p / q 型により結果が異なる(後述) 剰余演算子 (9 を 4 で割った余り = 1) 9 % 4 インクリメント・デクリメント a++ a-- ++a --a 変数の値を 1 増加する 変数の値を 1 減少する 後置の評価値は変更前の値、前置は変更後の値 2015-04-27 C プログラミング入門 総機1 (月1) 5 その他の演算子 ビット演算子 (ビットごとに行われる) 演算: シフト: & AND | << >> OR 関数呼び出し ^ XOR ~ NOT C の規格では算術シフトか論理シフ トかは未定義 printf("hello") ポインタ関係 今後の回で説明 間接演算子 *, アドレス演算子 & 要素選択 . -> キャスト, サイズ演算子, カンマ演算子 Etc… 2015-04-27 C プログラミング入門 総機1 (月1) 6 複合代入演算子 演算と代入を同時に行う a += 7 a = a + 7 と同じ 記号の順番に注意 -= &= <<= 2015-04-27 *= |= >>= /= ^= %= C プログラミング入門 総機1 (月1) 7 式の評価 (evaluation) 演算子の計算を行うこと、関数の呼び出しを することなどで、値を計算することを評価 (evaluation) という s = (x + 2) * 2; ⇓ (変数の評価) s = (5 + 2) * 2; ⇓ (+ 演算子の評価) s = 7 * 2; ⇓ (/ 演算子の評価) 代入演算も評価値を持つ s = 14; ⇓ (代入演算子の評価) 最後の評価値は捨てられる 14; 2015-04-27 x 5 関数の呼び出しも 演算子の一種 s ? 代入で書き換えられる s 14 C プログラミング入門 総機1 (月1) 8 演算の順序 どの演算子から演算を行うかは優先順位と結 合方向で決まっている(詳しくはリファレンス参照) 優先順位 異なる演算子の演算順番 おおよそ数学の用法に近いが、一部は直観と反す る 結合方向 同じ演算子、または優先順位が同じ演算子の順序 a+b+c は (a+b)+c (左から右) となるなど 2015-04-27 C プログラミング入門 総機1 (月1) 9 代入演算について 代入演算子はその代入された値を評価値とし て持つ 代入演算子を複数つなげて、連続した代入を 行うことができる x = y = 5; x = (y = 5); x = 5; 2015-04-27 (右から左への結合) 代入演算子の評価により 5 C プログラミング入門 総機1 (月1) 10 printf() も評価値を持っている printf も値を返す関数である 普段はあまり利用されず、単に無視されている 標準出力 printf("Hello, world!\n"); ⇓ (printf 関数の評価) 14; Hello, world! ▮ 出力された文字数が返され るが、そのまま捨てられる 2015-04-27 C プログラミング入門 総機1 (月1) 11 除算演算子の注意 int 同士の除算は結果が切り捨てられて int に なる int x = 5, y = 2; int x = 5, y = 2; double z; 浮動小数点リテラル 整数リテラル double z; z ⇓ z ⇓ z ⇓ z = (x + y) / 2; (変数の評価) = (5 + 2) / 2; (+ 演算子の評価) = 7 / 2; (/ 演算子の評価) = 3; 結果が整数となった 2015-04-27 z ⇓ z ⇓ z ⇓ z = (x + y) / 2.0; = (5 + 2) / 2.0; = 7 / 2.0; = 3.5; C プログラミング入門 総機1 (月1) 少なくとも一方が double なら結果は double になる 12 制御構造 逐次実行 関数は、ブロック内の文を 書かれた順に実行する 条件分岐 変数などがある条件を満た す場合だけ実行する ループ(反復) 条件を満たす間、繰り返し 実行する 2015-04-27 基本的には、条件判断と ジャンプ(実行位置の変 更)があれば実現できる。 C プログラミング入門 総機1 (月1) 13 制御構文 条件分岐(今回) ループ(次回) if - else for switch - case while (goto) do - while 2015-04-27 C プログラミング入門 総機1 (月1) 14 if 文 構文 if (式) 文; if (式) {ブロック} ブロックとは { } で複数 の文をまとめた部分のこと である。 { } を含めてブ ロックですが、ここでは、 わかりやすいように { } を明示的に書いています。 与えられた条件を満たす場合のみ、次の文ま たはブロックを実行するための構文 式の値は以下の様に扱われる 0 以外…真 (true); 条件を満たした 0 …偽 (false); 条件を満たさなかった 2015-04-27 C プログラミング入門 総機1 (月1) 15 条件判断のための演算子 制御構造の条件式として主に使われる 成り立てば 1 (真), そうでなければ 0 (偽) 比較演算子 代入演算子 = とは異なることに注意 x == 10 x < y y != 5 x > y 論理演算子 ≠ a >= b a <= b =>, =< というものはない 複数の比較を結合する (以下 x, y は真偽値) x && y x || y !x 論理積 かつ、 and 2015-04-27 論理和 または、 or 論理否定 ではない、not C プログラミング入門 総機1 (月1) 16 条件式の例 X が 0 以上 if(x >= 0) 0 以上 20 未満 if(x >= 0 && x < 20) if((x >= 0) && (x < 20)) ☠if( 0 <= x < 20 ) 3の倍数 優先順位的には括弧 はなくてもよいが書 いた方が読みやすい 場合もある 数学でよく書かれる ような、こういう書 き方はできない if( x % 3 == 0 ) 2015-04-27 C プログラミング入門 総機1 (月1) 17 if 文の書き方 様々なスタイルがある 同じ行に書く if(x < 0) { printf("x is negative\n"); } 1文だけの場合は、書 かない 次の行に書く if(x < 0) { printf("x is negative\n"); } if(x < 0) printf("x is negative\n"); すべて一行で書く if(x < 0) { printf("x is negative\n"); } if(x < 0) printf("x is negative\n"); 2015-04-27 1文だけの場合、1行で 書く C プログラミング入門 総機1 (月1) 18 if 文の注意 (1) ブロックを書かない場合、次の 1 文のみが対 象となるため、書き方で勘違いをする可能性 がある ブロックがない if(x < 0) { printf("x is "); printf("negative\n"); } if (式) {ブロック} 2015-04-27 if(x < 0) printf("x is "); printf("negative\n"); 2行目は常に実行さ れる if (式) 文; C プログラミング入門 総機1 (月1) 19 if 文の注意 (2) 代入演算子と等価演算子の書き間違い 代入演算子 評価値は 0 となり、 常に偽となる if(x == 0) { printf("x is zero"); } if(x = 0) { printf("x is zero"); } gcc では -Wall -Wextra などの警告オプ ションを付けていれば、指摘してくれる 2015-04-27 C プログラミング入門 総機1 (月1) 20 if – else 文 構文 if (式) 文1 else 文2; 文1,2 はブロックで もよい 式が真の場合は文1を、偽の場合は文2をそれ ぞれ実行する 2015-04-27 C プログラミング入門 総機1 (月1) 21 if-else 文の例 式の評価に応じて実行される部分が変わる この場合、単に x とだけ書いても、 同じ意味になる。なぜなら、 0 で ない = 真 if(x != 0) { printf("x is non-zero\n"); } else { printf("x is zero\n"); } 2015-04-27 もちろん、ブロックでなくて も構わないが、ややこしくな るので、なるべくブロックで 書いた方がよいでしょう。 C プログラミング入門 総機1 (月1) 22 if 文が多重になる場合 else の後の文が if 文となる場合、見た目を簡 潔に書くための定型スタイルがある if(x == 0) { ... } else { if(x == 1) { ... } else { if(x == 2) { ... 2015-04-27 if(x == 0) { ... } else if(x == 1) { ... } else if(x == 2) { ... この様な else } if の連続をぶら 下がり else (dangling else) と 呼ぶことがある。 C プログラミング入門 総機1 (月1) 23 switch – case 文 整数の値に従って、実行する文を制御する 今回の講義では省略する 詳細は、2013年度の第4回後半を参照 2015-04-27 C プログラミング入門 総機1 (月1) 24
© Copyright 2024 ExpyDoc