taKyshu98's notes Blog

notes for computing and so on

教養のためのC言語学習と参考書

f:id:taKyshu98:20160811223226j:plain

パタヘネでは所々MIPSC言語とを読み比べながら学ぶ箇所がある。

アルゴリズムは別としてコード自体は文法的に簡潔であるため読めなくはないのだけれども、これまでC言語についてまとまった時間を割いて勉強したことがなかったので、今後の学習効率向上やスキルに幅を持たせるために少し立ち止まって勉強してみた。

学習に当たっては以下の本を読んだ。内容の整理というより書評になってしまった。

やさしいC

やさしいC 第4版 (「やさしい」シリーズ)

やさしいC 第4版 (「やさしい」シリーズ)

プログラミングを独学し始めた時期に手を出した本のうちの一冊でこの機会に再読。

練習問題を通して文法をバランス良く学ぶことができる。

後述のC言語教科書は文法をそこまで細かく解説しないので、概要を掴むのに役立つ。

C言語教科書 入門編

C言語教科書(入門編)

C言語教科書(入門編)

コマンドラインの使い方や処理系の違いといった環境面の解説が手厚く、またバイナリ・テキスト、文字コードといったデータの取り扱いやバブルソートを例にしたアルゴリズムへの示唆が自然に含まれておりC言語だけでなくプログラミング初学者におすすめできると思った。

ただ、環境としてはWindows前提なのでmacを使っている人は適宜、読み替える必要がある。

C言語を試用するという面ではかなりの充実度だが、構文をきっちりかっきり抑えたい人には物足りないかもしれないので別途、上述の『やさしいC』などの文法寄りの参考書と読み合わせると理解が深まると思う。

C言語教科書 上達編 誰でもわかる!C言語ベテラン技

C言語教科書(上達編) 誰でもわかる! C言語ベテラン技

C言語教科書(上達編) 誰でもわかる! C言語ベテラン技

C言語教科書 入門編』の続編でビット操作や様々なキャストを通して各データ型のバイト数とメモリ配置への意識が向上する一冊。 また、「第7章 言語仕様」のコンパイルエラーは発生しないけれども、結果が保障されない「副作用」の未定義的な観点は心に留めておく必要がある。

C言語ポインタ完全制覇

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

a[i]とi[a]が同じ値を示すといった、かなり極端な書き換え例を通して配列とポインタの文法上の考え方、読み替え方がとにかくよくわかる。 さらに「第2章 実験してみようーCはメモリをどう使うのか」ではパタヘネの実行ファイルのメモリ配置周りの解説に記憶域期間の具体的な視点を付与してくれる。 const修飾子や、関数ポインタ・ポインタの配列といった複雑なポインタ宣言の読解の仕方や利用に当たってのメリットも解説している。かなり有名な定番中の定番。

メモ

C言語教科書 入門編』で以下のようなサンプルコード(一部抜粋)がある。

このコードをコンパイルした実行ファイルに空ファイルをリダイレクトで標準入力として渡したときにのみ分岐の内に入ることを意図しているようだが、実際に実行する(MinGWコンパイル)と内容のあるファイルでも分岐の内に入ってしまう。feof関数はFILE構造体(sdtinをはじめとした標準ストリームはFILE構造体のポインタ)のファイル終了表示子を参照するため、この動作は正しいように思われる。詳しくはファイル終了表示子やgets(今となっては実用皆無であるが)、feof関数がどのように実装されているか、処理系の定義であるstdio.hを見れば良いのだろうが、制御文字を含めた入出力系はどの範囲をどういう勉強をすればいいか整理してから取り掛かりたいので一旦は課題に留めておく。