『C言語によるプログラミングの基礎』の疑問点†
教科書の非公式で勝手な正誤表です。
第1版第2刷(2004年1月15日発行)の記述に基づいています。
2.3†
- p.11 「#include <stdio.h> これはプリプロセッサといいプログラムの中で使う関数を指定する部分である。 … プリプロセッサとしてどのようなものを用いるかは」
- プリプロセッサ(preprocessor)は前処理を行うソフトウェアのことなので、ここは「これはプリプロセッサ指令といい … ヘッダファイルとしてどのようなものを用いるかは」が正しいのではないか。
- 同 「どのような場合でもstdio.hは必ず宣言しておかなければならない」
- 初心者向けの記述とは思うが、printfなどの標準入出力関数を用いないときはstdio.hは不要である。たとえば、Windows APIを用いるプログラムでは不要である。
- p.12 「関数の最後には必ず戻り値を返す関数が必要となる。この戻り値を返す関数がreturnである」
- returnは関数ではなく制御文である。ごく初期のCでは関数だったようであるが。
2.4†
- p.16 「C++が開発されたときに、改行までを一つの単位としてコメント文にする方法も付け加えられた」
- 誤りとはいえないが、「//」型のコメントはC言語の先祖にあたるBCPLから復活したものである。
3.8†
4.2†
- p.42 「Visual C++ではプログラム中に実数値を書くとすべて倍精度とみなされる」
- Visual C++だけでなく、倍精度(double)になるのが標準規格である。
4.3†
- p.56 「インクリメント演算子(++)とデクリメント演算子(--)は、浮動小数点(実数)の変数に対して用いることはできない」
4.4†
- p.68 「最近では、プログラミングの際に、特殊な場合を除いてgoto文は使わないというのが一般的になっている」
5.2†
- p.82 「これはPascalなどのプログラミング言語で用いられた書法だが、最近では、C言語でもこのようにmain関数を最後に置くプログラムがよく書かれるようになった」
- Pascalについては言語仕様で定められている。CについてはANSI Cの制定(1989年)以来、増えたのではないかと思われるが、これも「最近」や「よく」という表現がどの程度のことを言っているのかひっかかる…。
5.3†
- p.89 「5.3.2 外部変数(extern)」の説明
- 以前このページで教科書のexternの使い方は間違いだと書いたが、K&Rの『プログラミング言語C』の第1章(1.10)にも同じような使用例があることがわかった。よって、これは私のほうの間違いで、教科書の記述の通り、Cで「外部変数」とはグローバル変数と同義である。
- ただし、K&Rではこのような場合には「普通のやり方は、… extern宣言をすべて省く」とも書いてあり、教科書の「各関数の中でもexternを用いた使用宣言をするのが正式の使用方法である」という説明は、「正式」の根拠が怪しい。
- なお、外部変数(外部宣言の変数)とexternキーワードには直接の関係はない(K&R付録A10.2)ということで、externではなくstaticな外部変数もある。ちなみに、この教科書では、staticな外部変数についての説明はない。
5.5†
- p.104 「理由についてははっきりしないが、2次元以上の配列で(1)の方法を用いると、プログラムが正常に実行されない場合がある」
- 本当だろうか? たとえば、Visual C++のどれかのバージョンでは、これが正常に実行されないのだろうか?
6.1†
7.2†
- p.151 「コンピュータの処理能力が低く、… プログラムの高速化のために*(a+i)のようなポインタ演算が好まれていた。初期のCプログラミングの本では、できるだけポインタ表現を使うよう心がけていたものが多く見られる。現在では、配列a[i]という書式を用いても …」
- *(a+i)とa[i]についていえば、今のコンパイラでも昔のコンパイラでも内部処理に違いがあるとは思えない。*p++とa[i++]のことならば、そういうこともあるかもしれないが、ポインタ表記が好まれてきたのは、高速化のために心がけたというよりも、Cプログラマにとってそう考えたほうがシンプルで分かりやすいからではないだろうか。
- p.165 リスト7-13
- 「#include <stdlib.h>」がない。