为什么大多数C程序员这样命名变量:
int *myVariable;
而不是像这样:
int* myVariable;
两者都成立。在我看来,星号是类型的一部分,而不是变量名的一部分。有人能解释一下这个逻辑吗?
为什么大多数C程序员这样命名变量:
int *myVariable;
而不是像这样:
int* myVariable;
两者都成立。在我看来,星号是类型的一部分,而不是变量名的一部分。有人能解释一下这个逻辑吗?
当前回答
这只是个人喜好的问题。
当您阅读代码时,在第二种情况下,区分变量和指针更容易,但是当您将同一类型的变量和指针放在一行中时,可能会导致混淆(项目指南通常不鼓励这样做,因为这会降低可读性)。
我更喜欢在类型名旁边声明指针的对应符号,例如。
int* pMyPointer;
其他回答
一位伟大的大师曾经说过:“你必须按照编译器的方式来阅读它。”
http://www.drdobbs.com/conversationsa-midsummer-nights-madness/184403835
虽然这是关于const放置的主题,但同样的规则也适用于这里。
编译器将其解读为:
int (*a);
而不是:
(int*) a;
如果您养成了将星号放在变量旁边的习惯,它将使您的声明更容易阅读。它还避免了一些碍眼的东西,比如:
int* a[10];
——编辑——
为了准确解释我说它被解析为int (*a)时的意思,这意味着*与a的绑定比与int的绑定更紧密,就像在表达式4 + 3 * 7中,3与7的绑定比与4的绑定更紧密,因为*的优先级更高。
为了对ascii艺术表示歉意,解析int *a的A.S.T.大致如下所示:
Declaration
/ \
/ \
Declaration- Init-
Secifiers Declarator-
| List
| |
| ...
"int" |
Declarator
/ \
/ ...
Pointer \
| Identifier
| |
"*" |
"a"
如图所示,*与a的绑定更紧密,因为它们的共同祖先是Declarator,而您需要沿着树一直向上走到Declaration才能找到涉及int的共同祖先。
它们是完全相等的。 然而,在
int *myVariable, myVariable2;
显然,myVariable的类型是int*,而myVariable2的类型是int。 在
int* myVariable, myVariable2;
很明显,两者都是int*类型,但这是不正确的,因为myVariable2的类型是int。
因此,第一种编程风格更直观。
如果你从另一个角度来看,*myVariable是int类型,这是有意义的。
因为当你有这样的声明时更有意义:
int *a, *b;
因为这一行中的*与变量的绑定比与类型的绑定更紧密:
int* varA, varB; // This is misleading
正如@Lundin在下面指出的,const增加了更多需要考虑的微妙之处。你可以通过每行声明一个变量来完全避免这个问题,这永远不会有歧义:
int* varA;
int varB;
清晰的代码和简洁的代码之间的平衡是很难实现的——十几行冗余的int a;也不好。不过,我还是默认每行声明一次,并担心以后组合代码的问题。