「どんな言語でプログラムを作成する場合でも,役に立つプログラミングの基礎とは何か」と考えはじめると,コンピュータの動作原理に近いところにたどり着いてしまいます。具体的には,コンピュータのメモリーにデータがどのように配置されているかをイメージできるようになること,コンピュータの中ではあらゆるデータが0と1の並びつまり2進数の固まりとして処理されていることを意識できるようになること――などです。
「2進数やメモリーの使い方なんか意識しなくても,プログラムは作成できるよ。そのための高級プログラミング言語*1じゃないか」という意見はきっとあるでしょう。また,筆者も「これから勉強するなら,いきなりオブジェクト指向*2の考え方やUML*3の使い方などから入った方が良いのでは」と思う時があります。
しかし,コンピュータがデータを処理する具体的なイメージを獲得することは,プログラムのデバッグ*4などの問題解決に役立つだけではなく,バグそのものを減らすことにもつながります。メモリーにデータが記憶されている様子や,データが処理されていくイメージをより鮮明に描けるようになるからです。
最初から,ちょっと難しい話になってしまいました。この連載の目的は,C言語を学びつつ,メモリーの中のことやデータが2進数で処理される様子が楽にイメージできるようになることです。なんだか大変そうですが,少しずつ解説していきますので,どうぞおつきあいください。
この連載は今回で3回目ですが1回目,2回目をお読みでない方も,まだ間に合います。1回目は,C/C++コンパイラ「Borland C++ Compiler 5.5」をインストールして*5,「Let's start C programming.」という文字列を表示するプログラムを作成しました。C言語のプログラムには「main」という名前の関数が一つ必要で,main関数からプログラムは実行されること,関数の中でコードは上から順に実行されreturn文で終了することを説明しました。
本連載の2回目では主に変数を解説しました。変数を
int a;
と定義することは,aという名前(変数名)で扱える場所をメモリーの中に作成することと,char,short int,intなどの変数の「型」によって確保するメモリーの量(バイト数)が違うことを説明しました。
それから,これまで出てきた標準関数*6はprintf関数とscanf関数で,これらの関数を使うための情報が「stdio.h」というヘッダー・ファイルに記述されており,#includeというプリプロセサ命令を使って自分の作ったプログラムに取り込まなくてはいけないことを説明しました。
演算子を覚えよう
今回のテーマは,「+」や「=」など,C言語で利用できる様々な記号を理解することです。この記号を演算子と呼びます。1回目,2回目で紹介したサンプル・プログラム中には,いくつかの演算子が出てきました。たとえば,
c = a + b;
というコードは,変数aとbを加算した値をcに代入する意味です。「+」は算術演算子,「=」は代入演算子と呼ばれています。「=」は,数学では“左右が等しい”という意味ですが,C言語では“右辺(=の右側)の値を左辺(=の左側)に代入する”という意味です。上のコードを実行すると,実行前の変数cの値がなんであっても,実行後にはa+bの計算結果で上書きされます。
また,
printf("aのアドレスは %p\n",&a);
というコードに出てくる「&」はアドレス演算子と呼びます。アドレス演算子を使うと,変数が作成されたメモリー上の住所を知ることができます。上のコードでは,変数aのメモリー上のアドレス(番地)を変換仕様「%p」を使って16進数で表示します*7。上のコードを実行すると,
aのアドレスは 0012FF88
のように表示されます。

ここでちょっと寄り道です。上のアドレスは16進数で表示されています。「データを2進数でイメージしようと言っておきながら,今度は16進数も覚えなくてはならないのか?」と面倒に感じられたかもしれませんね。実は16進数と2進数は相性が良いので変換が簡単なのです。
16進数は16で桁上がりする数です。10進数でいう15までの値を1桁で表現するために,10以降はA,B,C,D,E,Fと表記します。表1を見ていただければわかるように,2進数4桁の最大値は1111です。1111は16進数のFに該当します。16進数では,2進数4桁を1桁で表現できるのです。それに対して10進数は,2進数とうまく対応がとれません。
変数のアドレスは16進数8桁で表現されています。2進数にすると8×4で32個,つまり32ビットでアドレスが管理されています。32個の0と1の並びを人間が見るのはつらいので,4桁を1桁で表すことができる16進数でアドレスを表示しているのです。