为什么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;