2011年9月8日

ポインタ宣言の*記号、左寄せ派? 右寄せ派?

C/C++でポインタ変数を宣言するときの*記号をint* a;のように左寄せで書くか、int *a;のように右寄せで書くか。 右寄せで書く場合、「Cでは宣言と使用の文法を一致させる」という規則から考えれば素直に解釈できるという話。
16
🔫武藤スナイパーカスタム @__tai2__

宣言のときのポインタの*位置、C言語書いてるときは変数名にくっつけて、C++書いてるときは型にくっつけてる。

2011-09-07 18:03:03
🔫武藤スナイパーカスタム @__tai2__

ポインタの位置、どっちにしようが整合性って意味ではイマイチだよね。

2011-09-07 18:49:52
ハガ @hagat

@mutotaiju 僕は名前の方に*付ける(って言い方は正確でない)派ですが、自分の中ではちゃんと整合性は取れてますヨ。

2011-09-07 19:21:58
🔫武藤スナイパーカスタム @__tai2__

@hagat *記号は型の一部なので、左寄せにするほうが筋が通ってるという見方も。

2011-09-07 22:48:09
ハガ @hagat

@mutotaiju それだと筋が通らない場合がありますよね。僕はC以来伝統のルール「宣言の文法は使用と同じ」を適用して、演算子の優先順位から見て自然な書き方を採用します。でここがポイントなんですが、int *a;を、「intポインタ型のa」とは読みません。(続く)

2011-09-07 22:55:49
ハガ @hagat

@mutotaiju そうではなく、int *a;は「*演算子を適用するとintの値が出てくるのがa」と読みます。つまり使用する時にどうなるか、って事を基準に考えます。こう考えると、*は名前(というよりは、*の適用先)に寄せるのが合理的で、いつでも筋が通ります。

2011-09-07 22:59:14
🔫武藤スナイパーカスタム @__tai2__

@hagat そういう説は初めて聞きました。しかし、int *は、typedefの対象になるし、templateのパラメータにもなるので、やはり実質的には型なのでは?

2011-09-07 23:05:54
ハガ @hagat

@mutotaiju Cでは宣言と使用の文法を一致させる、という話は聞いた事ありませんか? 長々と書きましたが、ぶっちゃけそれさえ覚えてれば、いつでも一貫した書き方、解釈ができるし、複雑な宣言も簡単に読み解けるし書けるのですが。

2011-09-07 23:16:57
ハガ @hagat

@mutotaiju あ、でもちろんポインタも含めて型ではありますよ。で、「『型』を書く時は、宣言から識別子を除く」と覚えます。そうすると、配列へのポインタを表す型「int (*)[10]」などに出てくる謎の'( )'もすんなり解釈できるのではないでしょうか。

2011-09-07 23:19:12
🔫武藤スナイパーカスタム @__tai2__

@hagat あー、なるほど……なるほど。勉強になりました。

2011-09-07 23:39:51
🔫武藤スナイパーカスタム @__tai2__

「Cでは宣言と使用の文法を一致させる」ので、ポインタ宣言の*記号は右寄せで書いたほうが自然、という指摘。なるほど。

2011-09-07 23:51:41
🔫武藤スナイパーカスタム @__tai2__

ポインタの型を書くときにint *のように書く場合も、*の右隣に架空の識別子が存在すると見立てる。そうすると、すべて辻褄が合う。

2011-09-07 23:56:48
🔫武藤スナイパーカスタム @__tai2__

C++のガイドブックなんかだと、だいたいint*はintポインタ型という解釈で、*記号左寄せで書いてるので、そのまま従ってた。

2011-09-08 00:02:41
🔫武藤スナイパーカスタム @__tai2__

@hagat あ、でもその解釈、C++の参照記号&で崩壊することに気づきました。

2011-09-08 00:06:20
ハガ @hagat

@mutotaiju 「参照は識別子に&付加」を追加するだけで問題無くないですか? それよりメンバ(関数)ポインタの方がw

2011-09-08 00:11:59
🔫武藤スナイパーカスタム @__tai2__

@hagat 「Cでは宣言と使用の文法を一致させる」は参照には適用できないなと。参照はまた別、というのであればそれはそれでいいですが…。

2011-09-08 00:15:28
ハガ @hagat

@mutotaiju あ、そうか「使用時」の話ですね!w それは確かにそうなんですが、使用時に&付けると煩いですしね。そこは特別ルールっていうか、さっきのルールはCの基本なので、C++ではまぁ例外も色々ありますね。

2011-09-08 00:18:56
🔫武藤スナイパーカスタム @__tai2__

@hagat すくなくとも、Cの中だけであれば教えていただいた解釈で精神の健康を保つことができそうです。ありがとうございました。

2011-09-08 00:20:42

コメント

コメントがまだありません。感想を最初に伝えてみませんか?