arton:新版 独習C

作成日:2020-08-08
最終更新日:

概要

C 言語の初歩から応用まで説明する。

釘を刺す

「はじめに」で、著者は C 言語について釘を刺している。いわく、 《C は(中略)少しも初心者にフレンドリーなプログラミング言語ではない》、 いわく、《C は刃がむき出しのカミソリに相当します。 (中略)素人が毎朝の髭剃りに使うには実に厄介きわまりないしろものです。》

古色蒼然

p.2 で C 言語がほぼ半世紀近くも使用されている言語であることに触れている。そして、 《読者のみなさんの周りの C の熟達者から得られる情報と本書の情報が大きく異なることがあるかもしれません。》 と注意している。そのあとで、《正しい答えは1つではありませんし、常に変化します。》としめくくっている。

私は C の熟達者ではないが、本書を見るまで知らなかったことについて述べる。

printf の各種 int 用書式指定子

p.81 のコードを見た。 printf の int 用書式指定子は %d だけだと思っていたが、%i という書式指定子があることに驚いた。 そして、long int, long long int の書式指定子がそれぞれ %li, %lli とであること、 これらを合わせて整数の出力には %i を本書では使用するということだった。これからは %i を使っていこう。

関数的マクロから関数のインライン展開へ

C++ を勉強しだしたとき、C にはないが C++ にある便利な機能として関数のインライン展開があった。 だから、C ではインライン展開はできないと思っていたが、インライン関数を明示した関数宣言をすれば、 C コンパイラはインライン展開を試みる。このことを本書の p.89 を読んで初めて知った。

ブール型と真偽値

p.95 から、ブール型と真偽値について述べられている。 私がプログラムを書いていたときはブール型はなく、#define ディレクティブで定義するか、 enum で 定義していた。C11 以前に、C99 で、stdbool.h をインクルードすれば、 bool が型名として使え、true と false も真偽値として使えるようになることを知った。 恥ずかしい。

可変長配列

p.122 では、《C11 の仕様では、配列の要素数に変数を指定することが認められています》とある。 これは、C の開発者が待ち望んでいた仕様であった。 はるか昔、私が C Magazine という雑誌を購読していたころ、 この構文を仕様に追加すべきだと岩谷宏氏が雑誌の記事でさかんに主張していたのを思い出した。

goto 文とフラグ変数

goto 文については私は使ってはならないと思い込んでいたのだった。p.135で 《goto は 10 年ほど前までは「利用してはならない」という規約が支配的だったために、 よいスタイルが生まれる余地がなかったためです。》という記載がある。私はまさにこの規約に縛られていた。 次の p.136 では、goto 文を利用しないで多重ループの内側から抜けるために手段として、 フラグ変数が紹介されている。ところが、著者はいう。 《ソースコードに多量のフラグ変数が導入された結果、読解不能となったプログラムはいくらでも存在します。 その結果、goto 文を使うほうがまだましという結論に至っているのが現状です。》 そうなのか。わたしもかつてはフラグ変数を使ったプログラムをしていたが、こういうのはいけない、 ということか。現在、GO TO トラベルというキャンペーンの最中であり、 つい goto 文について考えてしまった。

なお、goto 文が不可避な例として、有限オートマトンの遷移を記述するプログラムがあると聞いたことがある。

文字列操作について

p.175 の注意では、《C11 では付録 K で、 新たな文字列を決められた長さ以内の領域にナル文字つきで配置する安全な関数群を規定しています。》 とある。具体的な関数名については触れられていないが、インターネットで調べると、安全な関数群の一例として、 危ないといわれる strcpy のかわりに strcpy_s (アンダースコアの次の s は safe の意味か) があることがわかった。これを試すには、
https://en.cppreference.com/w/c/string/byte/strcpy
を参考にすればいいのだろうが、Windows Subsystem on Linux の ubuntu では、gcc でも clang でも、 #ifdef __STDC_LIB_EXT1__ から #endif の行は実行されなかった。 つまり、strcpy_s 関数は実装されていないということだ。

関数ポインター

ポインターの理解はそれほど時間がかからなかったが、 関数ポインターを理解するのはかなり時間がかかった。 著者はこう書いている:《関数ポインターは、関数のアドレスを格納したポインター変数のことですが、 「関数ポインター変数」と書くと長すぎるので、 ここでは単に関数ポインターと記述します。》

継体天皇

p.307 に構造体の代入の例として、name に Keitai を、born に 450 を、died に 531 を初期値とした、 Person の構造体を作っている。これはいったい何のことかと思ったら、 継体天皇のことのようだ。なかなか C 言語を学習するのも大変だ。

C の本

書誌情報

書 名新版 独習C
著 者arton
発行日2018 年 2 月 16 日
発行元翔泳社
定 価3000円(税別)
サイズ
ISBN978-4-7981-5024-6
備 考越谷市南部図書室で借りて読む
NDC007.6

まりんきょ学問所コンピュータの部屋コンピュータの本C言語 > arton:新版 独習C


MARUYAMA Satosi