Presentation is loading. Please wait.

Presentation is loading. Please wait.

プログラミング入門2 第4回 式文 代入式 論理演算子 ループの脱出、スキップ 情報工学科 篠埜 功.

Similar presentations


Presentation on theme: "プログラミング入門2 第4回 式文 代入式 論理演算子 ループの脱出、スキップ 情報工学科 篠埜 功."— Presentation transcript:

1 プログラミング入門2 第4回 式文 代入式 論理演算子 ループの脱出、スキップ 情報工学科 篠埜 功

2 今日の内容 複合文について(前回の説明の補足) 式文 代入式 論理演算子 ループの脱出、スキップ

3 複合文(ブロック)の構文につい て 複合文の構文 { 0 個以上の宣言あるいは文の並 び } 複合文の意味 複合文中の文を順番に実 行 1999 年の ISO 規格( C99 と呼ばれる)では、複合文 の中で、変数宣言は先頭部分以外に書いてもよい こととなっている。 複合文の先頭以外で宣言した場合、その変数の有 効範囲はそこから始まる。 ただし、内側の複合文で同じ名前の変数が宣言さ れたら、その地点以降、その複合文の最後までを 除く。 現状では 1990 年の ISO 規格(教科書はこれに基づいて書かれてい る)に従っておくのが無難。

4 複合文の例1(打ち込んで確 認) #include int main (void) { int x; x=3; int y; y=4; printf ("x=%d, y=%d\n", x, y); return 0; } 変数 y の宣言を複合文の 先頭以外で行っている。

5 複合文の例2(打ち込んで確認) #include int main (void) { int x; x=3; { printf ("x=%d\n", x); /* x の値は 3 */ x=100; int x; printf ("x=%d\n", x); /* x の値は未定義 */ x=5; printf ("x=%d\n", x); /* x の値は 5 */ } printf ("x=%d\n", x); /* x の値は 100 */ return 0; } 変数 x が内側の複合文 の途中で宣言されてい る。

6 式文 例えば、文 x=1; は、 x=1 が代入式であり、その次にセミコロンが書かれ ているという構造をしている。式の次にセミコロン; を書くと文になる。これを式文と言う。 式文の構文1 式;式; 式文 e; の意味 式 e を評価する。評価結果は捨てる。 式文は文であり、文が書けるところならどこにでも書くことができる。 式文は、式の評価中に変数への代入や画面への出力などが起こる場合 に用いる。 1+2; なども式文であり文であるが、このような文は書く意 味がない。

7 式文の構文2: 空文 何もしない文として、空文というものがある。空 文も式文である。 式文の構文2(空文): ; 空文 ; の意味 何もしな い こんな構文を使う機会がないように思うか もしれないが、使われることもあるので紹 介する。

8 これまでに出てきた式文の例 代入式のあとにセミコロン x = 1+2 ; 関数呼び出し式のあとにセミコロン(関数の 回でもう一度説明する) printf (“test”) ; scanf (“%d”, &x) ; 赤字の x=1+2, printf(“test”), scanf(“%d”,&x) の部 分はそれ自体式であり、値を持つ。(式文で はそれは捨てられるが。)

9 代入式について 代入式の構文 変数名 = 式 代入式 x = e の意味 まず式 e を評価し、その結果の値を 変数 x に代入する。代入式の値は変 数 x に代入された値である。 (注意) 代入式 x=e の値は、式 e の値とは必ずしも同じではない。 例えば、 int x; x = 2.95; のような例では、 x には 2 が代入されるので、代入式 x=2.95 の値は 2 である。 (代入式の構文は後で(配列やポイン タの回で)拡張する)

10 代入式がネストされたプログラム 例1 (打ち込んで確認) #include int main (void) { int x; int y; x = y = 2; printf (“x=%d, y=%d\n”, x, y); return 0; } 赤字の y=2 の部分は代入式であ り、外側の代入式 x=y=2 の右辺 を成している。(代入式のネス ト) 代入演算子 = は右結合である。 つまり、式 x=y=2 は、式 x=(y=2) と等価で ある。

11 代入式がネストされたプログラム 例2 (打ち込んで確認) #include int main (void) { double x; int y; x = y = 1.5; printf (“x=%f, y=%d\n”, x, y); return 0; } 代入式 y=1.5 においては、 y が int 型なので 1.5 が int 型に変換され、 1 が y に代入される。 よって、代入式 y=1.5 の値は 1 である。次に x=1 が評価され、 x が double 型なので、 1 が double 型 に変換され, 1.0 が x に代入される。

12 よくある間違い(打ち込んで確 認) #include int main (void) { int x; x = 1; if (x=2) { printf (“x の値は 2 です \n”); } else { printf (“x の値は 2 ではありません \n”); } return 0; } 赤字の x=2 の部分は代入式であり、 x に 2 が代入される。よって代入式 x=2 の値は 2 である。 if 文の条件式 の値が 2 であり、 0 ではないので、 最初の printf が実行されることに なる。 x==2 と書くつもりが、 x=2 と書いてしまうということがよく あるので、注意する。

13 論理 AND 演算子 && /* キーボードから月を読み込み、その月が春かどうかを 判定 ただし 3 月から 5 月を春とする。 */ #include int main (void) { int month; printf (“ 月を入力してください: “); scanf (“%d”, &month); if (month >= 3) { if (month <= 5) printf (“ 春です。 \n”); else printf (“ 春ではありません。 \n”); } else printf (“ 春ではありません。 \n”); return 0; } 3 以上 5 以下の判定は if 文の ネストで書けるが、 if 文一 つで書きたい。

14 論理 AND 演算子 && (打ち込んで確 認) /* キーボードから月を読み込み、その月が春か どうかを判定。ただし 3 月から 5 月を春とする。 */ #include int main (void) { int month; printf (“ 月を入力してください: “); scanf (“%d”, &month); if (month >= 3 && month <= 5) printf (“ 春です。 \n”); else printf (“ 春ではありません。 \n”); return 0; }

15 論理 AND 式 論理 AND 式の構文 式 && 式 論理 AND 式 a && b の意味 まず式 a を評価し、その評価結果が 0 の場合は式 b は評価せずに a&&b の 評価結果は 0 となる。式 a の評価結 果が 0 でない場合、式 b を評価し、 その値が 0 のときは 0 、そうでない 場合は1が式 a&&b の評価結果とな る。 a, b に代入式や printf などを含む式を使うのは避けた方がよい。 真偽が定まった時点で評価を終える。 Short circuit evaluation という。

16 論理 AND 式の評価に関する確認 (打ち込んで確認) #include int main (void) { int x; x = 5; if (0 && (x=1)) printf ("true\n"); else printf ("false\n"); printf ("x=%d\n", x); return 0; } 代入式 x= 1 は評価されない。

17 論理 OR 式 論理 OR 式の構文 式 || 式 論理 OR 式 a || b の意味 まず式 a を評価し、その評価結果が 0 でない場合は式 b は評価せずに a||b の評価結果は 1 となる。式 a の 評価結果が 0 の場合、式 b を評価し、 その値が 0 のときは 0 、そうでない 場合は1が式 a||b の評価結果とな る。 a, b に代入式や printf などを含む式を使うのは避けた方がよい。

18 論理 OR 演算子 || を使った例 (打ち込んで確認) /* キーボードから月を読み込み、その月が春か どうかを判定。ただし 3 月から 5 月を春とする。 */ #include int main (void) { int month; printf (“ 月を入力してください: “); scanf (“%d”, &month); if (month == 3 || month == 4 || month ==5) printf (“ 春です。 \n”); else printf (“ 春ではありません。 \n”); return 0; }

19 論理演算子の優先順位について 四則演算の演算子では、 +, - より *, / の優 先順位が高い。 論理演算子の && は || より優先順位が高い。

20 && と || の優先順位を示す例 (打ち込んで確認) #include int main (void) { if (1 || 0 && 0) printf (“true\n”); else printf (“false\n”); return 0; } 0 && 0 が || の右側の引数と解 釈されるので、条件部分が 1 となり、 true が表示される。

21 否定演算子 ! 否定式の構文 !式!式 否定式 !e の意味 式 e を評価し、その評価結果が 0 の とき 1 、そうでない場合 0 が !e の評 価結果である。

22 否定演算子を使った例(打ち込んで確 認) #include int main (void) { if (!0) printf (“true\n”); else printf (“false\n”); return 0; } !0 の評価結果は 1 であり、 true が表示される。

23 ループの脱出 (goto 文による ) (打ち込んで確認) /* 5 匹目を数えるところで終了 */ #include int main (void) { int x; x = 1; while (x <= 10) { if (x == 5) goto aaa; printf (“ 羊が %d 匹 \n", x); x=x+1; } aaa: return 0; }

24 ループの脱出( break 文による) (打ち込んで確認) /* 5 匹目を数えるところで終了 */ #include int main (void) { int x; x = 1; while (x <= 10) { if (x == 5) break; printf (“ 羊が %d 匹 \n", x); x=x+1; } return 0; } break 文が実行されると、それが属す る最も内側のループ (while ループ, for ループ, do while ループ ) の直後の部分 へジャンプする。 break 文は後に紹介する switch 文を脱出するためにも使われる。

25 ループのスキップ (goto 文による ) (打ち込んで確認) /* 5 匹目だけ表示しない */ #include int main (void) { int x; x = 1; while (x <= 10) { if (x == 5) { x=x+1; goto aaa; } printf (“ 羊が %d 匹 \n", x); x=x+1; aaa: ; } return 0; } ここのセミコロンは空文。

26 ループのスキップ (continue 文による ) (打ち込んで確認) /* 5 匹目だけ表示しない */ #include int main (void) { int x; x = 1; while (x <= 10) { if (x == 5) { x=x+1; continue; } printf (“ 羊が %d 匹 \n", x); x=x+1; } return 0; } continue 文が実行されると、それが属 する最も内側のループ (while ループ, for ループ, do while ループ ) の最後の部 分へジャンプする。

27 演習課題 1.整数を2つキーボードから入力し、それらの和を表示す るということを繰り返すプログラムを書け。ただし、毎回以 下のようなメッセージを出し、確認するようにせよ。 続ける場合 1 を、終了する場合 0 を入力してください: 2. 正の整数をキーボードから入力し、各桁の数および桁 数を以下のように表示するプログラムを書け。 (例)入力した数が 234 の場合: 1 の位は 4 です。 10 の位は 3 です。 100 の位は 2 です。 234 は 3 桁の数です。 (チャレンジ課題:1も2もできた人用) 正の整数をキー ボードから( 10 進表現で)入力し、それの 2 進表現での各桁 の数および桁数を表示するプログラムを書け。これができた ら 16 進表現で同様のことを行え。 (ヒント) 10 で割った余りが1の位、 10で割った商が1の位を取り除い た数である。商が0の場合は1桁の 数である。


Download ppt "プログラミング入門2 第4回 式文 代入式 論理演算子 ループの脱出、スキップ 情報工学科 篠埜 功."

Similar presentations


Ads by Google