为什么大多数C程序员这样命名变量:
int *myVariable;
而不是像这样:
int* myVariable;
两者都成立。在我看来,星号是类型的一部分,而不是变量名的一部分。有人能解释一下这个逻辑吗?
为什么大多数C程序员这样命名变量:
int *myVariable;
而不是像这样:
int* myVariable;
两者都成立。在我看来,星号是类型的一部分,而不是变量名的一部分。有人能解释一下这个逻辑吗?
当前回答
当你在一个语句中初始化和赋值一个变量时,例如:
int *a = xyz;
将xyz的值赋给a,而不是*a。这使得
int* a = xyz;
一个更一致的符号。
其他回答
对于在一行中声明多个指针,我更喜欢int* a, * b;它更直观地将“a”声明为指向整数的指针,并且在同样声明“b”时不会混合样式。就像有人说的,我不会在同一个语句中声明两种不同的类型。
因为这一行中的*与变量的绑定比与类型的绑定更紧密:
int* varA, varB; // This is misleading
正如@Lundin在下面指出的,const增加了更多需要考虑的微妙之处。你可以通过每行声明一个变量来完全避免这个问题,这永远不会有歧义:
int* varA;
int varB;
清晰的代码和简洁的代码之间的平衡是很难实现的——十几行冗余的int a;也不好。不过,我还是默认每行声明一次,并担心以后组合代码的问题。
当你在一个语句中初始化和赋值一个变量时,例如:
int *a = xyz;
将xyz的值赋给a,而不是*a。这使得
int* a = xyz;
一个更一致的符号。
它们是完全相等的。 然而,在
int *myVariable, myVariable2;
显然,myVariable的类型是int*,而myVariable2的类型是int。 在
int* myVariable, myVariable2;
很明显,两者都是int*类型,但这是不正确的,因为myVariable2的类型是int。
因此,第一种编程风格更直观。
喜欢int* x的人;试图将他们的代码强行带入一个虚构的世界,在这个世界中,类型在左边,标识符(名称)在右边。
我说“虚构的”是因为:
在C和c++中,一般情况下,声明的标识符被类型信息包围。
这听起来可能很疯狂,但你知道这是真的。下面是一些例子:
int main(int argc, char *argv[]) means "main is a function that takes an int and an array of pointers to char and returns an int." In other words, most of the type information is on the right. Some people think function declarations don't count because they're somehow "special." OK, let's try a variable. void (*fn)(int) means fn is a pointer to a function that takes an int and returns nothing. int a[10] declares 'a' as an array of 10 ints. pixel bitmap[height][width]. Clearly, I've cherry-picked examples that have a lot of type info on the right to make my point. There are lots of declarations where most--if not all--of the type is on the left, like struct { int x; int y; } center.
这种声明语法源于K&R希望声明能够反映用法。阅读简单的声明是凭直觉的,而阅读更复杂的声明可以通过学习右-左-右规则(有时称为螺旋规则或只是右-左规则)来掌握。
C语言非常简单,许多C程序员都接受这种风格,并将简单的声明写成int *p。
在c++中,语法变得有点复杂(有类、引用、模板、枚举类),作为对这种复杂性的反应,您将在许多声明中看到将类型与标识符分离的更多努力。换句话说,如果你检查了大量的c++代码,你可能会看到更多的int* p风格的声明。
在任何一种语言中,你都可以将类型放在变量声明的左边,方法是(1)永远不要在同一个语句中声明多个变量,以及(2)使用typedefs(或别名声明,讽刺的是,它将别名标识符放在类型的左边)。例如:
typedef int array_of_10_ints[10];
array_of_10_ints a;