アカウント名:
パスワード:
Cのポインタはそれ自体が曲者だと思いますよ。
ポインタを使わないのならCを使う意味がない、と言ってもいいと思います。
そうだよな。ポインタぐらいでgdgd言ってたら、ダブルポインタ必要な時、どうするのかと。
ポインタ配列のポインタとか、アロケータブルなメモリ管理用のメモリ空間へのポインタのポインタとか頭痛くなったもんなぁ
3年目くらいまでは「毎回」マス目を書いて矢印書いてってやってました。ポインタから離れて久しいので今やるとやっぱりマスと矢印書くと思います。
配列へのポインタとか、関数へのポインタとか、関数の配列へのポインタとか。更に上に上げたポインタを返す関数とかになると更に強烈な妖怪と化します。標準関数ではsignalのプロトタイプ [c-tipsref.com]がまさにそれです。
/* ただし最近はtypedefを使って定義されているので妖怪度は低いです */
関数の配列へのポインタは有限状態機械を実装するのに実際に使ったことがあります。というかこれってポインタの問題ではなくてCのポインタ宣言の構文の問題ですね。
ポインタに魅了されてしまったせいで、他の言語が使いこなせ(使いたく)なくなる。
それくらい有害な機能だと思います。
Cのポインタは、インデックスレジスタ(汎用レジスタのアドレスポインタモード)を抽象化した物だから、機械語が分かっていれば何の不思議も無い。
でも、Cでのポインタ関連の「宣言構文」は、凄く曲者だと思う。何で、あんな仕様になったのやら...
あれはそれなりに合理的かつわかりやすいのですが、演算子の前置後置や優先度がややこしいので台無しになっています
あと、人はどうも変数を宣言するときと使うときで別の思考回路が働いている印象はありますpointer to array of intはわかりやすいし、(*a)[10]もわかりやすいですが、int (*)[]は軽く死ねます真ん中の式からaとか10を取り除いただけですが
いや、int *a;は、*aがint型である、という意味だから。そう考えると、とても素直な表現だと思うよ。
わけがわからなくなったのはC++以降。
なんでaの宣言に*aのことを書くのん?
aの宣言なのにintって書くでしょ?
int* a,b;と書く流儀はC++以降ですが、はっきりいって糞だと思います。
(int*) a, b;のように書きたいなあ
C++というかStroustrup氏の流儀だとおもいますが、そのスタイルの場合、
int* a;int b;
のように、「一宣言文で複数の変数を宣言しない。変数宣言は一行一変数。」という流儀もセットです。片っぽだけ採用しちゃだめ。
#そう徹底すれば、確かに「int* a,b」問題は起きませんけど…、冗長なので私は好きになれません。
> ネットでは 「ポインタ型」の宣言なんだから 型の部分が int* の方がわかりやすいという意見も結構あるみたいですね。
マシン語を経験したことのない人にはそちらの方が分かりやすいかも知れませんが、もっと複雑なことを考えると破綻します。「int*」は整数へのポインタ型を表す表記として、じゃあ「ポインタへの配列」とか「関数へのポインタ」はどういう表記をすればいいの?って。
そもそも「*」は演算子ですし。
8ビット時代のBASICから入った私としては、スペースなんてどうでもいいのですが。
それを言われたらプロセッサの立つ瀬が無くなるインデックスレジスタや間接アドレッシングが曲者(?)だとでも言うのか?もともとC言語はハード(プロセッサ)に近いところにある「低レベル」なプログラミング言語最近の抽象化が進んだモダンなプログラミング言語とは違うCのポインタが使えない・使う必要が無いのならそもそも他の言語を選ぶべきなのだ
ポインタが曲者だっていうのは単にそいつの理解力が貧弱なだけだが、5["abcdef"]って書ける(C言語FAQ 6.11参照)ようになってるのは、C言語の奇妙な特徴として挙げるにふさわしいね。
>5["abcdef"]って書ける
これ逆じゃないすか。"abcdef"[5]=='f'
別ACだけど、> C言語FAQ 6.11参照って書いてあるんだから、ちゃんと読もうよ。
なぜそうなっているか、というロジックは分かってしまえば単純だけど、あえてその書き方をするのは邪悪ですね。(配列表現そのものがポインタの糖衣構文だから、より分かりにくくなってしまうのは糖衣構文の意義に反する)。
そもそもその書き方ができることは、IOCCC [ioccc.org]で初めて知りました。と言うかそれ以外では見たことがありません。むしろIOCCCでは定番の表現ですね。それほどにまで邪悪で奇妙だと言えるでしょう。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy
そんな細かい話じゃなくてさ、 (スコア:1)
Cのポインタはそれ自体が曲者だと思いますよ。
Re:そんな細かい話じゃなくてさ、 (スコア:3, すばらしい洞察)
ポインタを使わないのならCを使う意味がない、と言ってもいいと思います。
Re: (スコア:0)
そうだよな。
ポインタぐらいでgdgd言ってたら、ダブルポインタ必要な時、どうするのかと。
Re: (スコア:0)
ポインタ配列のポインタとか、アロケータブルなメモリ管理用のメモリ空間へのポインタのポインタとか頭痛くなったもんなぁ
Re: (スコア:0)
3年目くらいまでは「毎回」マス目を書いて矢印書いてってやってました。
ポインタから離れて久しいので今やるとやっぱりマスと矢印書くと思います。
Re: (スコア:0)
配列へのポインタとか、関数へのポインタとか、
関数の配列へのポインタとか。
更に上に上げたポインタを返す関数とかになると更に強烈な妖怪と化します。
標準関数ではsignalのプロトタイプ [c-tipsref.com]がまさにそれです。
/* ただし最近はtypedefを使って定義されているので妖怪度は低いです */
関数の配列へのポインタは有限状態機械を実装するのに実際に使ったことがあります。
というかこれってポインタの問題ではなくてCのポインタ宣言の構文の問題ですね。
Re:そんな細かい話じゃなくてさ、 (スコア:2)
ポインタに魅了されてしまったせいで、他の言語が使いこなせ(使いたく)なくなる。
それくらい有害な機能だと思います。
Re:そんな細かい話じゃなくてさ、 (スコア:2)
Cのポインタは、インデックスレジスタ(汎用レジスタのアドレスポインタモード)を抽象化した物だから、機械語が分かっていれば何の不思議も無い。
でも、Cでのポインタ関連の「宣言構文」は、凄く曲者だと思う。
何で、あんな仕様になったのやら...
-- Buy It When You Found It --
Re:そんな細かい話じゃなくてさ、 (スコア:1)
あれはそれなりに合理的かつわかりやすいのですが、演算子の前置後置や優先度がややこしいので台無しになっています
あと、人はどうも変数を宣言するときと使うときで別の思考回路が働いている印象はあります
pointer to array of intはわかりやすいし、(*a)[10]もわかりやすいですが、int (*)[]は軽く死ねます
真ん中の式からaとか10を取り除いただけですが
Re: (スコア:0)
これはなんとかしてほしいところ。
あとは宣言時と利用時とは別の記号にしてほしかったかなー。
宣言時は *付きがポインタを意味するけど、利用時は *付きは実際の値を意味する(ポインタじゃなくなる)。
Re: (スコア:0)
いや、
int *a;
は、*aがint型である、という意味だから。
そう考えると、とても素直な表現だと思うよ。
わけがわからなくなったのはC++以降。
Re: (スコア:0)
なんでaの宣言に*aのことを書くのん?
Re: (スコア:0)
aの宣言なのにintって書くでしょ?
Re: (スコア:0)
a について直接語っていないので人によってはすごく判りにくいとおもう。
この表現が素直だと思えるようになるのは慣れればこそじゃないかな。
int *a は a ではなく *a について述べていると読めば多少は理解しやすくなるかも。
#この記法は判りやすさではなく使う記号とシンタックスを節約した結果だと思う。
Re: (スコア:0)
で指摘したかったのは、a がポインタなのに b は int ってことでしょ。
言語仕様として両方ともポインタと言うことにしておけばわかりやすかったと。
# int *a;
# ではなくて
# int * a;
# と記述する流儀もあります。
Re: (スコア:0)
そうです、元々言いたかったのは bがintになる所です。
特に
int* a, b;
とした時ですね。
# int * a は初めて見ました。 サイズ計算してるみたいに見えますね。
(int *a, b で bがポインタになると逆に勘違いしてました。)
Re:そんな細かい話じゃなくてさ、 (スコア:1)
int* a,b;
と書く流儀はC++以降ですが、はっきりいって糞だと思います。
Re: (スコア:0)
(int*) a, b;
のように書きたいなあ
Re:そんな細かい話じゃなくてさ、 (スコア:1)
C++というかStroustrup氏の流儀だとおもいますが、そのスタイルの場合、
のように、「一宣言文で複数の変数を宣言しない。変数宣言は一行一変数。」という流儀もセットです。片っぽだけ採用しちゃだめ。
#そう徹底すれば、確かに「int* a,b」問題は起きませんけど…、冗長なので私は好きになれません。
Re: (スコア:0)
int* a, b;
で、bがintであるという所。
Re: (スコア:0)
ネットでは 「ポインタ型」の宣言なんだから 型の部分が int* の方がわかりやすいという意見も結構あるみたいですね。
いずれにしてもどっちでもよくなってしまったがために面倒な事になってる気がしますが。
Re: (スコア:0)
> ネットでは 「ポインタ型」の宣言なんだから 型の部分が int* の方がわかりやすいという意見も結構あるみたいですね。
マシン語を経験したことのない人にはそちらの方が分かりやすいかも知れませんが、もっと複雑なことを考えると破綻します。
「int*」は整数へのポインタ型を表す表記として、じゃあ「ポインタへの配列」とか「関数へのポインタ」はどういう表記をすればいいの?って。
そもそも「*」は演算子ですし。
8ビット時代のBASICから入った私としては、スペースなんてどうでもいいのですが。
Re:そんな細かい話じゃなくてさ、 (スコア:1)
それを言われたらプロセッサの立つ瀬が無くなる
インデックスレジスタや間接アドレッシングが曲者(?)だとでも言うのか?
もともとC言語はハード(プロセッサ)に近いところにある「低レベル」なプログラミング言語
最近の抽象化が進んだモダンなプログラミング言語とは違う
Cのポインタが使えない・使う必要が無いのならそもそも他の言語を選ぶべきなのだ
Re:そんな細かい話じゃなくてさ、 (スコア:1)
Re: (スコア:0)
ポインタが曲者だっていうのは単にそいつの理解力が貧弱なだけだが、
5["abcdef"]って書ける(C言語FAQ 6.11参照)ようになってるのは、
C言語の奇妙な特徴として挙げるにふさわしいね。
Re:そんな細かい話じゃなくてさ、 (スコア:2)
>5["abcdef"]って書ける
これ逆じゃないすか。
"abcdef"[5]=='f'
Re: (スコア:0)
別ACだけど、
> C言語FAQ 6.11参照
って書いてあるんだから、ちゃんと読もうよ。
Re: (スコア:0)
なぜそうなっているか、というロジックは分かってしまえば単純だけど、
あえてその書き方をするのは邪悪ですね。
(配列表現そのものがポインタの糖衣構文だから、より分かりにくくなってしまうのは糖衣構文の意義に反する)。
そもそもその書き方ができることは、IOCCC [ioccc.org]で初めて知りました。
と言うかそれ以外では見たことがありません。むしろIOCCCでは定番の表現ですね。
それほどにまで邪悪で奇妙だと言えるでしょう。