アカウント名:
パスワード:
プログラミング言語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タブなのだけは、さすがに真似できなかった…
あなた、ポインタが判っていませんね。
ひょっとしてエスパーして(#1528209)を
int a;int *p=&a;
と
int a;int *p;p=&a;が等価なのは不思議だなぁ。
っていう風に解釈したのでしょうか?
全然そういう話には読めませんねぇ。#int* p=&a; って書くとあら不思議。不思議じゃなくなりますw
>なぜポインタ型だけ特別視するのでしょう?
アセンブラ寄りの人にとってはポインタ型という概念自体が気持ち悪いからじゃね?
>アセンブラ寄りの人にとってはポインタ型という概念自体が気持ち悪いからじゃね?
それは86系に限っての話じゃないですかね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
プログラミング言語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:プログラミング言語C (スコア:0)
ハンガリアン記法でも使っていて下さい。
> 初期のCを飛ばして、C++やJavaから入った人だと、
> int* p;
> と書くようです。
初期のCを使って、その後の変化についていけない人だと
int *p;
と書くようです。
"型宣言 変数名"という形で統一した方がわかりやすいと思うのですが。
なぜポインタ型だけ特別視するのでしょう?
Re:プログラミング言語C (スコア: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タブなのだけは、さすがに真似できなかった…
Re: (スコア:0)
ポインタの宣言
int *p;
ポインタへの代入
p = hoge;
ポインタの指す先への代入
*p = hoge;
なぜポインタへの代入が*p=hoge;で、ポインタの指す先への代入がp=hoge;でないのだろう。
Re: (スコア:0)
あなた、ポインタが判っていませんね。
Re: (スコア:0)
宣言部と手続部で(*)が違う意味の記号として扱われている事は、
C言語を学べば必ず疑問に思うだろうし。
Re: (スコア:0)
ひょっとしてエスパーして(#1528209)を
int a;
int *p=&a;
と
int a;
int *p;
p=&a;
が等価なのは不思議だなぁ。
っていう風に解釈したのでしょうか?
全然そういう話には読めませんねぇ。
#int* p=&a; って書くとあら不思議。不思議じゃなくなりますw
Re: (スコア:0)
int a=0;
a=1;
int *p=&a;
p=&b;
*p=c;
ね、なんか変でしょ?
Re: (スコア:0)
本来は、
int hoge;
int *p = &hoge;
p = &hoge;
…と書くところを、
int hoge;
int *p = *hoge;
*p = *hoge;
…と書けるようにしなかったのは、
「何故なんだ?」と #1528209 は聞いているんだろ?
なんでオマエは、ソースは読めて日本語が読めないんだよ。
Re: (スコア:0)
#1528209とは関係ないです。コメントが重なっているため、変な所にぶら下がって見えますが。
#1528363に対するコメントではないならば、このコメントは無視してください。
#1528408さんにもそうですが、言語の改良云々のコメントは後から出てきたので…
元々は現状の文法に対する話だったので、こう解釈すべきなんじゃないの?
という意味のコメントです。書ける様にに改良すべきといわれても…
Re: (スコア:0)
エスパーはやめてください。
> #1528363に対するコメントなら、申し訳ないけれど、あのコメントは#1527913にたいしてしたものなので、
> #1528209とは関係ないです。コメントが重なっているため、変な所にぶら下がって見えますが。
変なところにぶら下がってるのは、#1528287 のコメントだけのようですが?
そもそも別のツリーになっている #1528363 への返信を、#1528255 につける意味がわかりません。
また、しっかり名指しで #1528209 を反論しているのに、その記事とは関係がないというのも意味がわかりません。
残念ながら私はエスパーではないので、
Re: (スコア:0)
>なぜポインタ型だけ特別視するのでしょう?
アセンブラ寄りの人にとってはポインタ型という概念自体が気持ち悪いからじゃね?
Re: (スコア:0)
>アセンブラ寄りの人にとってはポインタ型という概念自体が気持ち悪いからじゃね?
それは86系に限っての話じゃないですかね。