コンテンツへスキップ
Topos Uranos

要約

このレッスンは、式とその演算子にあてられた、コースの第三単元の始まりである。まず単元の目的を説明する。すなわち、どの演算が先に行われるか、結果がどの型になるか、どんな副作用があるか、そしてどの式が意味をもたないかを知ったうえで、値を確実に予測できる式を組み立てることを教えることである。さらに、単元の四つのレッスンと、整数と実数の算術からビットと数学ライブラリまで、条件と未定義動作の一覧を経てそれらを貫く筋道を示し、単元が第二単元から前提とすること、すなわち各データの型、その限界、その変換を思い出させる。そして単元が解決する問題、つまり警告を一つも出さずにコンパイルされるのに、学校で習う六つの問いへの答えがすべて誤っている、あるいは答えが出ないプログラムの問題を提示し、この先の単元と「C++ プログラミング II」コースへどうつながるかを示す。

学習目標

  1. 単元の内容の順序を述べ、各レッスンがそのあとのレッスンに何をもたらすかを説明する。
  2. 第 2 単元から必要なこと(整数型と実数型、それらの値の範囲、オーバーフロー、型変換)を思い出し、必要なら復習する。
  3. 例を用いて、式の値が計算の規則(優先順位、オペランドの型、作用の順序)に左右され、それらが学校の数学の規則と必ずしも一致しないことを予告する。
  4. 単元の終わりにできるようになるはずのことを確認し、それをこの先の単元で学ぶことと区別する。

導入テスト

単元に取りかかる前に、出発点を測っておくとよい。このテストは自己チェックのためのもので、採点はしない。目的はただ学習の方向づけにある。最初の四問は、単元が第二単元から前提とすることを確かめる。整数どうしの割り算、二進法での書き方、符号なしの引き算、そして符号付きのオーバーフローである。続く六問は、レッスンの順に、単元の中心となる考え方を扱い、そのいくつかは学校の数学や初歩の論理から出発する。まだ正解できなくてもかまわないし、そのうちの二問では「まだわからない」が誠実な答えである。正解であれ不正解であれ、どの答えもその要点を説明し、それを扱うレッスンを示すからである。同じ技能は、単元の最後のまとめのレッスンで再び測る。

導入テスト

単元を始める前に、自分の出発点を測りましょう。短い自己評価です。採点はされず、結果はあなたのブラウザーにだけ保存されます。

  1. 問 1前の単元からあるプログラムが const double r{7 / 2}; と宣言し、r を書き出す。何が表示されるか。

  2. 問 2前の単元から数 13 を 8 ビットの二進法で書くとどうなるか。

  3. 問 3前の単元から32 ビットの unsigned int のもとで、std::println("{}", 0u - 1); は何を書き出すか。

  4. 問 4前の単元からあるプログラムが int count{std::numeric_limits<int>::max()}; を実行し、続いて count = count + 1; を実行する。count の値について規格は何を保証するか。

  5. 問 52+3⋅42 + 3 \cdot 4 と (2+3)⋅4(2 + 3) \cdot 4 はそれぞれいくつか。

  6. 問 6数学の除法の定理に従い、余り rr に 0≤r<20 \leq r < 2 という条件を課すとき、商 qq と余り rr(−7-7 を 22 で割ったときの)はそれぞれいくつか。

  7. 問 7「雨が降っていて、かつ寒い」の否定はどれか。

  8. 問 8std::println("{}", 3 < 5); は何を書き出すか。

  9. 問 9int a{5}; と int b{a++ * 2}; のあと、a と b はそれぞれいくつか。

  10. 問 10std::println("{}", 2 ^ 3); は何を書き出すか。