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

要約

命令型のプログラムは結果を一度に計算するのではない。途中の値を保存し、それを変えながら、一歩ずつ結果を組み立てる。このレッスンでは、値が保存される場所である変数を学ぶ。変数とは、名前と型と値をもつメモリの区画である。変数を波括弧で宣言し初期化する方法と、波括弧が推奨される理由、代入によって値を変える方法(代入の記号 = は数学での意味とは違う)、プログラムの状態、すなわち各時点でのすべての変数の値をトレース表で追う方法、変数が何を保持するかを語る名前の選び方、そしてこの段階で最も目立たない誤り、つまり一度も値を与えられていない変数を読むこと(C++ では未定義動作である)を避ける方法を教える。

学習目標

  1. 変数を波括弧で宣言し初期化し、与えられたプログラムの中で初期化と代入を区別する。
  2. 代入が続くプログラムの状態をトレース表で手で追い、それによって出力を予想する。
  3. 言語の規則とこのコースのガイドに従って、各変数が何を保持するかを語る英語の名前を選ぶ。
  4. 初期化されていない変数を読むことがなぜ未定義動作なのかを説明し、プログラムの中でそれを見つけ、常に初期化することでそれを防ぐ。

区画としての変数

レッスン 問題からアルゴリズムへ では、アルゴリズムは qq や rr のような文字で書かれ、それらはある値をとったあとで別の値をとった。「rr の値を r−br - b にする」というように。数学では、文字は未知であっても一つの固定した値を表す。これに対してアルゴリズムでは、文字は内容が変わる場所を表す。C++ のプログラムにも同じものが必要であり、それはコンピュータのメモリから得られる。

主記憶はバイトの長い列であり、各バイトには通し番号、すなわちアドレスがある。変数とは、プログラムが名前と型を与えたメモリの一部分である。したがって変数には四つの属性がある。

  1. 名前。プログラムはこれで変数を指す(count、price)。
  2. 型。どんな値を保持できるか、何バイトを占めるか、どんな演算を許すかを定める。int は整数を、double は小数をもつ数を保持する。
  3. 値。ある時点で保持している値であり、プログラムの実行中に変わりうる。
  4. メモリ上の場所。コンパイラとシステムが選ぶもので、プログラムがそれを知る必要はほとんどない。

覚えておくとよい図は区画の図である。名前は上に書かれ、値は中に入っている。型は区画の大きさと形である。int の区画には 2.5 が入らない。郵便受けの仕切りに小包が入らないのと同じである。このレッスンの図はこのようにプログラムの状態を描き、文を一つ実行するたびに描き直す。

型が大きさを決めることは目で確かめられる。演算子 sizeof は、変数または型が占めるバイト数を与える。

C++ のプログラム
#include <print>​int main(){    const int count{12};    const double price{4.5};    std::println("count は {} バイト", sizeof(count));    std::println("price は {} バイト", sizeof(price));}
出力
count は 4 バイトprice は 8 バイト

ここでは int は 4 バイトを占め、double は 8 バイトを占める。この数はすべてのシステムで同じではなく、各型にいくつの異なる値が収まるかはこの数で決まる。それはレッスン 整数とその表現 とレッスン 浮動小数点数 で学ぶ。ここでは要点だけで足りる。変数の型は宣言のときに決まり、決して変わらない。変わるのは値である。