プログラム言語 C
よく考えてみると C ってあんまり勉強したことがない初心者なので、 K&R を読んで勉強してみました。
わかったことは、
#
とか valid な C コードなんだなーとか。
あとやっぱり C の型宣言難しいですね。
int (*f(int argc, char* argv[]))(int argc, char* argv[]), (main);
この main の型わかりますか、とか。まぁ int なんだけど。
typedef int (*mainf)(int argc, char* argv[]); mainf f(int argc, char* argv), main;
これだと当然 int (*)(int argc, char* argv[]) だよなーという。つまり学んだことは最初の型 (なんか K&R の巻末の BNF もどきでは type-specifiers) 以外はホントに全部右辺にくっつくんだね、っていう。
あ、あと hoge が読めた人 はこっちにチャレンジするといいかもしれませんと思いました。
http://d.hatena.ne.jp/kikx/20061120#1164011256
あと C の型宣言はどうしようもないと思うわけですが、これまともに設計するとしたらどういう感じにするのが正解なのかしら。なんか少し考えても妙に括弧が多くなるような方法しか思いつかないなぁという。 D 風になんでも左から右にくっつけルールを徹底すると、
int(int, argv*[]) main = { puts("hello"); } void(int)* (int, void(int)*) signal;
とか?これ一意なんかよくわからないという。
あとなんか型の int 省略するゴルファーとかいうバカがいるわけですが、あれもなかなか困ったもんだよなーという。
main(argc, argv);
と
main(int, char**);
の区別とかつけるのめんどそう。
追記:
そういえば書き忘れてたのだけど、 C の仕様でああなるほどなぁと思ったのは、 typedef って他の型宣言と全く同じ書き方してるんだなぁということがありました。
declaration-specifiers: storage-class-specifier declaration-specifiers type-specifier declaration-specifiers type-qualifier declaration-specifiers
という感じで再帰的に何個でも storage-class-specifier とかがつく仕様になってるわけですが、この storage-class-specifier って、
storage-specifier: one of auto register static extern typedef
そう typedef ここなんですよね。私は驚いた。
int const long volatile unsigned typedef long mytype;
なんじゃこれ。