为什么c++;指针*关联到声明的变量,而不是类型? 所以,C++中的这种工作的动机是如何在C.中工作

为什么c++;指针*关联到声明的变量,而不是类型? 所以,C++中的这种工作的动机是如何在C.中工作,c++,pointers,language-design,declaration,C++,Pointers,Language Design,Declaration,不是 我知道有些人认为应该避免使用任何一种形式,并在自己的行中声明每个变量,但我感兴趣的是为什么要做出这种语言决定。为了保持与C代码的兼容性,因为C就是这样工作的 比亚恩提出了一个很好的观点: int*p之间的选择和int*p不是关于对与错,而是关于风格和重点。C强调表达;宣言通常被认为只不过是一种必要的罪恶。C++,另一方面,非常强调类型。 典型的C程序员编写int*p并解释它,*p是强调语法的int的意思,可能会指向C(和C++)声明语法来论证样式的正确性。实际上,*与语法中的名称p绑定

不是


我知道有些人认为应该避免使用任何一种形式,并在自己的行中声明每个变量,但我感兴趣的是为什么要做出这种语言决定。

为了保持与C代码的兼容性,因为C就是这样工作的

比亚恩提出了一个很好的观点:

int*p之间的选择
int*p不是关于对与错,而是关于风格和重点。C强调表达;宣言通常被认为只不过是一种必要的罪恶。C++,另一方面,非常强调类型。

典型的C程序员编写
int*p
并解释它,
*p是强调语法的int
的意思,可能会指向C(和C++)声明语法来论证样式的正确性。实际上,*与语法中的名称p绑定

A<代码>典型C++程序员写<代码> int *p;

并解释它
p是指向int类型的指针。事实上,p的类型是int*。显然,我更喜欢强调,并且把它看作是使用C++中更高级部分的重要。

<> P>所以,C++中的这种工作的动机是如何在C.</P>中工作
它在C中工作的动机是,如上所述,C强调表达式而不是类型。

简单的答案是:因为C就是这样做的。其中 当然,这只是回避了一个问题:为什么C会这样做

在早期的C中,最初的哲学思想是宣言是一个精确的定义 图像的使用。所以当你写作时:

int *p;
,您声明表达式
*p
具有类型
int
(以及 编译器相应地计算出
p
的实际类型)

当然,这在C引入
typedef
的那一天就不再是事实了 稍后
struct
。任何相似之处都会随着
const
(首先在C++中介绍,然后改写成C),在这里,像

int *const p;

与使用无关。但到那时,一切都已尘埃落定。

答案

它来自“C”(“纯C”,“纯C”,随便什么)

当指针变量已声明时,其用法如下:

...
*p = &x;
*q = SomePointerFunc();
....
我读到,“c”的最初发明者希望程序员用与所用语法相同的语法声明指针变量,在变量标识符前面加上星号:

...
int *p;
int *q;
...
阵列也是如此:

...
x[5]  = 'a';
y[77] = SomeItemFunc();
...

...
char x[5];
int  y[100];
...
我的一些老师坚持以这种方式声明变量和函数的类型(接近标识符的星号):

而不是这个(类型标识符旁边的星号):

额外的

在Java和其他语言(如C#)中,数组或指针的声明位于类型旁边,只保留变量或函数标识符,如以下伪代码:

*int p;
*int q;
char[5] x;
int[100]  y;
我更喜欢这种技术


欢呼。< /P>因为这是C语言中的方式。他们认为,用户可以同时声明指针和正常变量。这是因为C++中的原因,因为C的原因:我认为最奇怪的部分是初始化。假设我们有

int*p=newint[5]然后
int*a=&p可以:“给指针a一个p的地址”。但是
int*b=&p
很奇怪:“给整数*b一个p的地址”。考虑到*b是整数,为什么要给出地址?这就是为什么我发现指针的链式声明毫无意义。可能是@illEatYourPuppies的重复,但这是一个完全不同的问题:P@LuchianGrigore除非你没有任何好奇:)我通常用
int*p
运行,因为我发现这两种方式都很丑陋:)@nijansen这是最丑陋的,我把它理解为“计算<代码> int <代码>和<代码> P<代码>(乘法)!”你必须观察到Bjarne的最后一段是错误的。我从未见过C++程序员这么做,而且它与实际意义是不相容的。考虑OP的例子:int *p,q;并不意味着Q是int的指针。
...
int *p;
int *q;
...
...
int* p;
int* q;
...
*int p;
*int q;
char[5] x;
int[100]  y;