アカウント名:
パスワード:
プログラミング言語Cといえば、ポインタの章が理解できずに何度も読みすぎてそのページだけ黒くなっていました。ご逝去の報に接し、謹んで哀悼の意を表します。
Cの前にマシン語をやっていたので、ポインタは理解できた(というか、ポインタが理解できない人のことが理解できない)のですが、関数へのポインタの配列を返す関数にtypedefして~とか言うと、ついていけなくなります。
それから、
int *i;
は理解できますが、
int* i;
と書く発想が理解できません。「int*」って何だよ?って。
今は後者が主流な気がする本の影響もあってC++使いは特に
私の場合、Z80世代からパソコンをはじめて、今の本職はC++ですが、
int *p;
の書き方じゃないと落ち着きません。その変数がポインタであることが見た瞬間に理解できるような書き方をしたいので、*と変数名はつなげて書きたいです。
初期のCを飛ばして、C++やJavaから入った人だと、
int* p;
と書くようです。
そういう人は、 unsigned char* p; とか書くんでしょうか?unsignedとcharの間にスペースが入っているのに、charと*の間が詰まってるのって、気持ち悪くないですかね?
こういうのを見る度に、こっそり書き直したくてそわそわします。しかし、バージョン管理システムに履歴が残ってしまうので、迂闊に書き直すわけにもいきません。まったく困ったものです。
別にポインタを特別視はしていません。
「pはポインタである」→ *p「*pはintである」→ int *p
と読み下せます。(と多くの方が同様な主張をされていると思います)
同じ理屈で、
「funcはポインタである」→ *func「*funcは関数である」→ (*func)()「(*func)()はintを引数にとる」→ (*func)(int)「(*func)(int)は結果を返さない」→ void (*func)(int)故に、funcはintを引数にとり、結果を返さない、関数へのポインタである。
のように自然に読み下せます。
だから、*と変数名はつながっていないと、様々な型宣言で破綻します。
C言語の構文解析上は「int *p」も「int* p」も同じですから、どっちで書くかは、文法の話ではなく「コーディングスタイル」の問題じゃないですかね。まあ、スタイルの問題だからこそ、どちらも派閥も譲れないんだと思いますが
私は「int *p」と書く方ですが、そう書くようになったきっかけは「K&R で int *p と書かれていたから」です。ちゃんと文法を知ってからは、「ポインタの * は右結合なので、*pとくっつける」と、スタイルの意味は理解しましたが、それは後付けです。そういう構文解析が行われるからといって、「int* p」と書くことが文法違反になるわけじゃありませんし。
その後、 Stroustrup を読んで「int* p」と書く流儀の存在を知りましたが、あまりなじめず、C++でも「int *p」と書くのを貫いてます。
#「ifやwhileなどの予約語の後(の間にはスペースを入れる」「関数とその後の(の間にはスペースは入れない」#「ifやwhileと同じ行の終わりに { を入れる」など、基本的なコーディングスタイルはK&Rで通してるんですが、#インデントが5タブなのだけは、さすがに真似できなかった…
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
日本発のオープンソースソフトウェアは42件 -- ある官僚
プログラミング言語C (スコア:0)
プログラミング言語Cといえば、ポインタの章が理解できずに何度も読みすぎてそのページだけ黒くなっていました。
ご逝去の報に接し、謹んで哀悼の意を表します。
Re: (スコア:0)
Cの前にマシン語をやっていたので、ポインタは理解できた(というか、ポインタが理解できない人のことが理解できない)
のですが、関数へのポインタの配列を返す関数にtypedefして~とか言うと、ついていけなくなります。
それから、
は理解できますが、
と書く発想が理解できません。「int*」って何だよ?って。
Re: (スコア:0)
今は後者が主流な気がする
本の影響もあってC++使いは特に
Re: (スコア:2)
私の場合、Z80世代からパソコンをはじめて、今の本職はC++ですが、
int *p;
の書き方じゃないと落ち着きません。その変数がポインタであることが見た瞬間に理解できるような書き方をしたいので、*と変数名はつなげて書きたいです。
初期のCを飛ばして、C++やJavaから入った人だと、
int* p;
と書くようです。
そういう人は、 unsigned char* p; とか書くんでしょうか?
unsignedとcharの間にスペースが入っているのに、charと*の間が詰まってるのって、気持ち悪くないですかね?
こういうのを見る度に、こっそり書き直したくてそわそわします。しかし、バージョン管理システムに履歴が残ってしまうので、迂闊に書き直すわけにもいきません。まったく困ったものです。
Re: (スコア:0)
ハンガリアン記法でも使っていて下さい。
> 初期のCを飛ばして、C++やJavaから入った人だと、
> int* p;
> と書くようです。
初期のCを使って、その後の変化についていけない人だと
int *p;
と書くようです。
"型宣言 変数名"という形で統一した方がわかりやすいと思うのですが。
なぜポインタ型だけ特別視するのでしょう?
Re: (スコア:1)
別にポインタを特別視はしていません。
「pはポインタである」→ *p
「*pはintである」→ int *p
と読み下せます。(と多くの方が同様な主張をされていると思います)
同じ理屈で、
「funcはポインタである」→ *func
「*funcは関数である」→ (*func)()
「(*func)()はintを引数にとる」→ (*func)(int)
「(*func)(int)は結果を返さない」→ void (*func)(int)
故に、funcはintを引数にとり、結果を返さない、関数へのポインタである。
のように自然に読み下せます。
だから、*と変数名はつながっていないと、様々な型宣言で破綻します。
Re:プログラミング言語C (スコア:1)
C言語の構文解析上は「int *p」も「int* p」も同じですから、
どっちで書くかは、文法の話ではなく「コーディングスタイル」の問題じゃないですかね。
まあ、スタイルの問題だからこそ、どちらも派閥も譲れないんだと思いますが
私は「int *p」と書く方ですが、そう書くようになったきっかけは「K&R で int *p と書かれていたから」です。
ちゃんと文法を知ってからは、「ポインタの * は右結合なので、*pとくっつける」と、スタイルの意味は理解しましたが、それは後付けです。
そういう構文解析が行われるからといって、「int* p」と書くことが文法違反になるわけじゃありませんし。
その後、 Stroustrup を読んで「int* p」と書く流儀の存在を知りましたが、あまりなじめず、
C++でも「int *p」と書くのを貫いてます。
#「ifやwhileなどの予約語の後(の間にはスペースを入れる」「関数とその後の(の間にはスペースは入れない」
#「ifやwhileと同じ行の終わりに { を入れる」など、基本的なコーディングスタイルはK&Rで通してるんですが、
#インデントが5タブなのだけは、さすがに真似できなかった…