为什么人们使用Type * var而不是Type * var?

时间:2011-11-09 22:19:02

标签: c++ c pointers syntax

  

可能重复:
  Declaring pointers; asterisk on the left or right of the space between the type and name?
  Does it matter where I place the asterisk when declaring pointers in C++?

我搜索了,但我的关键字似乎不合适。我很确定这个问题已经被问过了。如果你知道某个链接或其他什么,请指点我的方向!

我的问题是,为什么这么多人使用

TypeIdentifier *varname;

而不是

TypeIdentifier* varname;

这对我来说更合乎逻辑,因为*修改了类型而不是变量名。

5 个答案:

答案 0 :(得分:3)

在C和C ++中,声明语法(主要是)遵循用法。

声明

int *n;

可以理解为“n类型为int*”,或“*n类型为int”。如果你看一下语言语法,后者更接近于解析它的方式。

对于仅包含名称(如int)和*的类型,它不会产生很大的差别,但它对于更复杂的声明很重要。

通常的趋势是在C中使用int *n;,在C ++中使用int* n;。后者是因为这是Stroustrup的个人偏好。我认为,他的观点是“n属于int*类型”阅读更自然,并且可以通过不编写复杂的声明来避免复杂性。例如,无论您喜欢哪种间距,最好写

int *a;
int b;

int* a, b;

int *a, b;

答案 1 :(得分:1)

嗯,语言的语法另有说法。您可以通过

轻松查看
Type * var1, var2;

这里会发生什么?

答案 2 :(得分:1)

这是因为C的声明语法。

int* a, b;

看起来好像定义了int*类型的两个变量,但实际上将a声明为类型int*而将b声明为类型int。如果你写

int *a, b;
这是显而易见的。我个人更喜欢不写这样的定义,而是写

int* a;
int b;

毫不怀疑这些类型。

答案 3 :(得分:1)

C约定是将*附加到变量,因为一行中的多个变量不共享*

int *a, b; /* a is an int*, while b is an int. */

在C ++中,规则是相同的,但由于上述声明的混淆性,以及随后每个声明只声明一个变量的做法,将wart附加到类型更常见:

int* a;
int b;

我倾向于C ++约定,但也允许在一行上有多个非指针或引用声明:

int a, b;
int* c;
int* d;

答案 4 :(得分:0)

因为K& R使用Foo *bar并且人们坚持使用它。