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/