アカウント名:
パスワード:
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から入った私としては、スペースなんてどうでもいいのですが。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ研究家
そんな細かい話じゃなくてさ、 (スコア:1)
Cのポインタはそれ自体が曲者だと思いますよ。
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から入った私としては、スペースなんてどうでもいいのですが。