Presentation is loading. Please wait.

Presentation is loading. Please wait.

04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと

Similar presentations


Presentation on theme: "04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと"— Presentation transcript:

1 04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
teachers/w483692/CPR1/

2 今日の内容 算術演算子 比較演算子 その他 条件分岐 if-else switch-case

3 代入演算子によって変数の内容を書き換えること 変数の初期化と似ているが、区別されている
代入 (assignment) 代入演算子によって変数の内容を書き換えること 変数の初期化と似ているが、区別されている #include <stdio.h> int main(void) { double x = 15, y = 10, s, m; s = x + y; m = s / 2.0; ... x, y を初期化 15 x 10 y ?? s ?? m s, m を式の評価値で置き換える(=代入)

4 基本的な演算子 (operators) 代入演算子 a = 7 (変数 a の値を 7 に書き換える) x = (複雑な式)

5 基本的な演算子 (operators) 四則演算子 剰余演算子 インクリメント・デクリメント
x y - z n * p / q 剰余演算子 9 % (9 を 4 で割った余り = 1) インクリメント・デクリメント a a a a 乗算 除算 型により結果が異なる(後述) 変数の値を 1 増加する 変数の値を 1 減少する 後置の評価値は変更前の値、前置は変更後の値

6 その他の演算子 (1) ビット演算子 (ビットごとに行われる) 関数呼び出し 演算: & | ^ ~
演算: & | ^ ~ シフト: << >> 関数呼び出し printf("hello") AND OR XOR NOT C の規格では算術シフトか論理シフトかは未定義

7 その他の演算子 (2) ポインタ関係 キャスト サイズ演算子 カンマ演算子 間接演算子 *, アドレス演算子 & 要素選択 . ->
要素選択 . -> キャスト (int)A サイズ演算子 sizeof(int) カンマ演算子 式1, 式2 今後の回で説明 強制的に型を変更する。 ただしルールは非常に難しいので使うときは注意。 char を 1 とする単位で返す。 sizeof(double) == 8 など 式1の評価値は捨てられて、結果は式2の評価値となる

8 複合代入演算子 演算と代入を同時に行う a += 7 a = a + 7 と同じ -= *= /= %= &= |= ^=
-= *= /= %= &= |= ^= <<= >>= 記号の順番に注意

9 演算子の計算を行うこと、関数の呼び出しをすることなどで、値を計算することを評価 (evaluation) という
s = (x + 2) * 2; ⇓ (変数の評価) s = (5 + 2) * 2; ⇓ (+ 演算子の評価) s = 7 * 2; ⇓ (/ 演算子の評価) s = 14; ⇓ (代入演算子の評価) 14; 5 x 関数の呼び出しも演算子の一種 s 代入で書き換えられる 代入演算も評価値を持つ 14 s 最後の評価値は捨てられる

10 どの演算子から演算を行うかは優先順位と結合方向で決まっている(詳しくはリファレンス参照) 優先順位
演算の順序 どの演算子から演算を行うかは優先順位と結合方向で決まっている(詳しくはリファレンス参照) 優先順位 異なる演算子の演算順番 おおよそ数学の用法に近いが、一部は直観と反する 結合方向 同じ演算子、または優先順位が同じ演算子の順序 a+b+c は (a+b)+c (左から右) となるなど

11 代入演算子はその代入された値を評価値として持つ 代入演算子を複数つなげて、連続した代入を行うことができる
代入演算について 代入演算子はその代入された値を評価値として持つ 代入演算子を複数つなげて、連続した代入を行うことができる x = y = 5; x = (y = 5); (右から左への結合) x = 5; 代入演算子の評価により 5

12 printf() も評価値を持っている printf も値を返す関数である 普段はあまり利用されず、単に無視されている
標準出力 printf("Hello, world!\n"); ⇓ (printf 関数の評価) 14; Hello, world! 出力された文字数が返されるが、この場合、特にそれを使っていないので、そのまま捨てられる

13 int 同士の除算は結果が切り捨てられて int になる
除算演算子の注意 int 同士の除算は結果が切り捨てられて int になる int x = 5, y = 2; double z; z = (x + y) / 2; ⇓ (変数の評価) z = (5 + 2) / 2; ⇓ (+ 演算子の評価) z = 7 / 2; ⇓ (/ 演算子の評価) z = 3; int x = 5, y = 2; double z; z = (x + y) / 2.0; z = (5 + 2) / 2.0; z = 7 / 2.0; z = 3.5; 整数リテラル 浮動小数点リテラル 少なくとも一方が double なら結果はdouble になる 結果が整数となった

14 制御構造 逐次実行 条件分岐 ループ(反復) 関数は、ブロック内の文を書かれた順に実行する 変数などがある条件を満たす場合だけ実行する
条件を満たす間、繰り返し実行する 基本的には、条件判断とジャンプ(実行位置の変更)があれば実現できる。

15 条件分岐(今回) ループ(次回) if - else for switch - case while (goto) do - while
制御構文 条件分岐(今回) if - else switch - case (goto) ループ(次回) for while do - while

16 if (式) 文; if (式) {ブロック} if 文 与えられた条件を満たす場合のみ、次の文またはブロックを実行するための構文
ブロックとは { } で複数の文をまとめた部分のことである。 { } を含めてブロックですが、ここでは、わかりやすいように { } を明示的に書いています。 与えられた条件を満たす場合のみ、次の文またはブロックを実行するための構文 式の値は以下の様に扱われる 0 以外…真 (true); 条件を満たした 0 …偽 (false); 条件を満たさなかった

17 if の例 条件によって表示が変わる。 x = 5 ▮ x = -3 x is negative ▮
5 で初期化した場合 #include <stdio.h> main(void) { int x = 5; // = -3; printf("x = %d\n", x); if(x < 0) printf("x is negative\n"); } return 0; x = 5 −3 で初期化した場合 x = -3 x is negative

18 条件判断のための演算子 制御構造の条件式として主に使われる 成り立てば 1 (真), そうでなければ 0 (偽) 比較演算子 論理演算子
x == 10 y != 5 x < y x > y a >= b a <= b 論理演算子 複数の比較を結合する (以下 x, y は真偽値) x && y x || y !x 代入演算子 = とは異なることに注意 =>, =< というものはない 論理積 かつ、 and 論理和 または、 or 論理否定 ではない、not

19 条件式の例 X が 0 以上 0 以上 20 未満 3の倍数 if(x >= 0)
if(x >= 0 && x < 20) if((x >= 0) && (x < 20)) if( 0 <= x < 20 ) 3の倍数 if( x % 3 == 0 ) 優先順位的には括弧はなくてもよいが書いた方が読みやすい場合もある 数学でよく書かれるような、こういう書き方はできない

20 基本的にはいつでもブロックで書くのが読みやすい
if 文の書き方 (基本) 基本的にはいつでもブロックで書くのが読みやすい 同じ行に書く 次の行に書く if(x < 0) { printf("x is negative\n"); } if(x < 0) { printf("x is negative\n"); } インデントを忘れない ほかにもたくさんあるが、あまり一般的ではない

21 以下の記法は、見づらくなることがあるので、他との整合性が十分とれる場合のみつかう。素人は使わない。
if 文の書き方 (その他) 以下の記法は、見づらくなることがあるので、他との整合性が十分とれる場合のみつかう。素人は使わない。 1文だけなので、ブロックにしない if(x < 0) printf("x is negative\n"); すべて一行で書く if(x < 0) { printf("x is negative\n"); x+=1; } 1文だけの場合、1行で書く if(x < 0) printf("x is negative\n");

22 ブロックを書かない場合、次の 1 文のみが対象となるため、書き方で勘違いをする可能性がある
if 文の注意 (1) ブロックを書かない場合、次の 1 文のみが対象となるため、書き方で勘違いをする可能性がある ブロックがない if(x < 0) { printf("x is "); printf("negative\n"); } if(x < 0) printf("x is "); printf("negative\n"); 2行目は常に実行される if (式) {ブロック} if (式) 文;

23 if 文の注意 (2) 代入演算子と等価演算子の書き間違い if(x == 0) { printf("x is zero"); }
評価値は 0 となり、 常に偽となる if(x == 0) { printf("x is zero"); } if(x = 0) { printf("x is zero"); } gcc では -Wall -Wextra などの警告オプションを付けていれば、指摘してくれる

24 if (式) 文1 else 文2; if – else 文 式が真の場合は文1を、偽の場合は文2をそれぞれ実行する 構文
文1,2 はブロックでもよい 式が真の場合は文1を、偽の場合は文2をそれぞれ実行する

25 if-else 文の例 式の評価に応じて実行される部分が変わる if(x != 0) {
printf("x is non-zero\n"); } else printf("x is zero\n"); もちろん、ブロックでなくても構わないが、ややこしくなるので、なるべくブロックで書いた方がよいでしょう。

26 else の後の文が if 文となる場合、見た目を簡潔に書くための定型スタイルがある
if(x == 0) { ... } else if(x == 1) if(x == 2) if(x == 0) { ... } else if(x == 1) else if(x == 2) この様な else if の連続をぶら下がり else (dangling else) と呼ぶことがある。

27 switch – case 文 整数の値に従って、実行する文を制御する 今回の講義では省略する 詳細は、2013年度の第4回後半を参照


Download ppt "04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと"

Similar presentations


Ads by Google