C言語復習中…

去年の1月ぐらいにちょっと勉強したC言語(C89)を今復習中。いや、ほんとはC++も勉強してたはずなんだけど。

でもC言語は言語仕様がコンパクトで分かりやすい。その実、罠だらけだが。とりあえずK&Rの後ろの規格的な部分をパラパラパラ…

  • メモリ上の一区域をオブジェクトというのね
  • 文字のリテラル表記はint型ね
  • 関数ポインタの書き方、忘れて無いね
  • 引数の関数ポインタはそのままポインタとして書かなくてもOK。関数ポインタから関数呼び出しする場合は*は不要だね
  • 変数宣言と関数宣言は殆ど同じような感じで、型宣言は外側から演算子を当てはめて読んでいけばいいのね
  • 関数の引数の[]表記はポインタをあらわしてる
  • 配列とポインタは似て非なるものなり
  • A[B] = B[A] = *(A + B)ね
  • 左辺値だからといって代入可能とは限らないね
  • Cに参照渡しはない
  • ビットフィールドってなんだっけ enum{~~=1, ~~=2, ~~=4, ~~=8,...} ってなってるやつかあ。
  • staticとexternが分かりました
  • ああ、こんなディレクティブあったっけ…
  • 可変長引数の使い方はすぐ忘れちゃうなあ
  • 毎度思うがCはLambda機能を入れる余地が大分あると思う。

Cのポインタは毎度複雑といわれるが、ポインタのアイディア自体が複雑なのではない。ポインタのアイディアも含んだ、あの文法と、型に対する再帰的な徹底性が複雑(なように見える)なのだ。

Cの標準仕様上ではあまりメモリがどうのとか、物理的なアーキテクチャがどうのとかは登場しない。個人的な感覚では、メモリがどうの、という話はしなくても、Cについて学ぶことが出来るんじゃないかなと思う。原理的に『学ぶことはできる』のだが、具体的なメモリのアーキテクチャの話をしつつ学ぶほうが学習効率はいいのだろう。

ただ一方、メモリがどうのなどと物理面から学びすぎると、言語仕様を疎かにしがちになり、変なキャストやらにまみれて、一応動くけど、警告が出まくる移植性の悪い、巷にあふれるああいうコードを書くようになるのだと思う。

具体的なメモリモデルに基づく学習は効率がよく、イメージを想起しやすいが、最終的には言語仕様の理解によるべきである。特にCは言語仕様に罠が多い。

とか、色々考えたり勉強したりしても仕方ない。なんか書こう。

C言語 FAQ 日本語訳
http://www.kouno.jp/home/c_faq/