22

次の間に違いがあるかどうか疑問に思っています:

char* var;
char *var;

それとも単なる好みの問題ですか(間隔)?

4

1 に答える 1

49

この場合、違いはありません。ただし、を優先する必要がありますchar *var;

これは、*が変数名とより密接に関連付けられており、基本型の一部ではないためです。たとえば、これを行う場合:

char* a, b;

あなたが持っているのはa、へのポインタchar、そしてbcharです。これは紛らわしいです!*文字はキーワードに近いため、両方charの変数の型は-へのポインターであると予想されますcharが、実際には。にのみ*関連付けられています。(これは、コメントでteppicによって指摘されているものと似ています。同様に、指定子はにのみ関連付けられているため、配列のみになります。)achar a[10], b;[10]aa

正しい宣言は次のようになります。

char *a, *b;

指定子を変数に近づけると、一方の変数をポインターにし、もう一方の変数をポインターにしない場合*に、何が起こっているのかを簡単に確認できます。

char *a, b;

この場合、それbがポインタであることを意図していないことは明らかです。元の例( )では、プログラマーがポインターになるchar* a, b;ことを意図していたかどうかはわかりません。bダグラス・クロックフォードから借りるには、プログラマーが無能であることがわかっています。

一部の人々は前後にスペースを置くのが好き*です:

char * a, * b;

これは、上に示したのと同じ問題の餌食になります。bがポインタでない場合、宣言(char * a, b;)もプログラマーの意図についての不確実性につながる可能性があります。*したがって、と変数名1の間にスペースを入れないことをお勧めします。

あなたがそれをどのように見ても、char* var;悪いスタイルとして扱われるべきです。言語仕様によれば文法的には正しいですが、指定子が同じ宣言内のすべての変数によって共有される型の一部であることが示されているように見えるため、コードが読み取れなくなります。*(複雑な関数をすべて同じ行に書くのと似ていますが、機能しますが、それは悪い考えです。読みやすさと保守性が個人の文体の好みに取って代わる場合があり、これはその1つです。)


1個人的には、関数の戻り値を処理する場合に* のみ、後にスペースを入れることを好みます。

char * foo();

これは明確です。これは、へのポインタを返す関数ですchar

char *foo();

プログラマーは、へのポインターを返す関数をchar意味しましたか、それとも、を返す関数へのポインターを作成することを意味しましたcharか?言語はこれを他のプロトタイプと同じように解決しますが、私たちの目標は読みやすさです。つまり、コンパイラだけでなく、人間に私たちが意味することを正確に伝えることを意味します。

于 2013-03-04T22:13:58.347 に答える