2011-11-09 71 views
-1

可能重复:
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++?为什么人们使用Type * var而不是Type * var?

我搜索,但我的关键字似乎并不适合。我很确定这个问题已经被问到了,所以如果你知道链接或者其他东西的话,请指出一些方向。

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

TypeIdentifier *varname; 

而不是

TypeIdentifier* varname; 

这是更合乎逻辑的我为*修改的类型,而不是变量名。

+3

在提出新问题之前,请先使用搜索 - 已在SO上询问并回答了*多次*。 –

+0

男人,我必须训练我的关键字技巧。感谢您的链接。 @mekici是的,它的确如此。那么,我呢。它有时让我很困惑,我必须仔细看看这个变量究竟是什么类型。 –

+0

Stroustrup建议'Type * name'而不是'Type * name' –

回答

3

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

声明

int *n; 

可以读作 “nint*型的”,或为 “*nint类型的”。如果你看看语言语法,后者更接近于它被解析的方式。

对于只包含一个名称(如int)和*的类型,它没有太大区别,但对于更复杂的声明很重要。

通常的趋势是在C中使用int *n;,在C++中使用int* n;。后者是因为这是Stroustrup的个人偏好。我认为他的观点是,“nint*”阅读更自然,复杂性可以通过不写复杂的声明来避免。例如,你喜欢的任何间距,最好是写

int *a; 
int b; 

比任何

int* a, b; 

int *a, b; 
0

由于K & R使用Foo *bar和人们坚持下去。

1

那么,语言的语法说不然。你可以很容易地通过检查

Type * var1, var2; 

这里会发生什么?

1

这是因为C'S声明语法。

int* a, b; 

看起来好像它定义int*类型的两个变量,但实际上宣告aint*类型和bint类型。如果你写

int *a, b; 

这是显而易见的。但我个人更喜欢不写这样的定义,而是写

int* a; 
int b; 

这不会对类型产生疑问。

1

的C约定是附加*的变量,因为连续多个变量不共享*

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

在C++中,规则是一样的,但更常见到疣连接到类型,由于上述声明的混乱性质,并宣布每声明只有一个变量的后续做法:

int* a; 
int b; 

我倾斜朝向C++惯例,但还允许含多处e在一条线上的非指针或参考声明:

int a, b; 
int* c; 
int* d; 
相关问题