为什么 C++ 被设计成在同一行声明两个 int *s 的正确方法是
int *x, *y;
不是
int* x,y;
我知道有些人认为您应该避免使用任何一种形式并在自己的行上声明每个变量,但我对为什么做出这种语言决定很感兴趣。
为什么 C++ 被设计成在同一行声明两个 int *s 的正确方法是
int *x, *y;
不是
int* x,y;
我知道有些人认为您应该避免使用任何一种形式并在自己的行上声明每个变量,但我对为什么做出这种语言决定很感兴趣。
为了保持与 C 代码的兼容性,因为这就是 C 的工作方式。
Bjarne在他的风格和技术常见问题解答中提出了一个很好的观点:
int* p;
和之间的选择int *p;
不是关于对与错,而是关于风格和重点。C 强调表达;声明常常被认为只是一种必要的罪恶。另一方面,C++ 非常强调类型。一个典型的 C 程序员写
int *p;
和解释它*p is what is the int
强调语法,并可能指向 C(和 C++)声明语法来争论风格的正确性。实际上,* 绑定到语法中的名称 p。A
typical C++ programmer
写int* p;
并解释它p is a pointer to an int
强调类型。实际上 p 的类型是 int*。我显然更喜欢这种强调,并认为它对于很好地使用 C++ 的更高级部分很重要。
因此,在 C++ 中像 this 这样工作的动机是它在 C 中的工作方式。
它在 C 中工作的动机是,如上所述,C 强调表达式而不是类型。
简单的答案是:因为 C 就是这样做的。当然,这只能引出一个问题:为什么 C 会这样做?
在早期的 C 中,最初的哲学是声明是使用的精确图像。所以当你写:
int *p;
,您声明表达式*p
具有类型int
(并且编译器相应地计算出实际类型p
)。
当然,这在 C 引入的那一天就不再是真的typedef
,后来struct
. 并且任何相似之处都完全消失了const
(首先在 C++ 中引入,然后改装到 C 中),其中像
int *const p;
和使用没有关系。但到那时,骰子已经落下。
回答
这来自“C”(“plain c”、“pure c”等)。
当已经声明了指针变量时,它的使用如下:
...
*p = &x;
*q = SomePointerFunc();
....
我读到“c”的最初发明者希望程序员使用与使用相同的语法来声明指针变量,变量标识符之前有星号:
...
int *p;
int *q;
...
数组也是如此:
...
x[5] = 'a';
y[77] = SomeItemFunc();
...
...
char x[5];
int y[100];
...
我的一些老师坚持以这种方式声明变量和函数的类型(靠近标识符的星号):
...
int *p;
int *q;
...
而不是这个(类型标识符旁边的星号):
...
int* p;
int* q;
...
额外的
在 Java 和其他语言(如 C#)中,数组或指针的声明位于类型旁边,只留下变量或函数标识符,如下面的伪代码:
*int p;
*int q;
char[5] x;
int[100] y;
我更喜欢这种技术。
干杯。