为什么大多数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;也不好。不过,我还是默认每行声明一次,并担心以后组合代码的问题。