为什么它认为'T*name'是C方式而'T*name'是C++方式?

Xeo*_*Xeo 17 c c++ history pointers conventions

注意:这个问题是关于星号(*)的位置.

在大多数C代码中,我看到(例如,在Beej的网络编程指南中),所有变量声明/定义都使用T *name格式,即绑定*到变量名称.指针被认为属于变量,而不是类型.

在我看到的大多数C++代码中,格式是T* name,即它绑定*到变量的类型.指针被认为属于类型,而不是变量.我自己,作为一个纯粹的C++编码器,也使用这种格式,因为指针类型清楚(对我来说)属于类型,而不是变量.(很明显,即使是C++标准也在示例中使用了这种格式.:))

这有(历史性的)原因吗?当程序员开始做C++时,思维方式是否有所改变?

如果一个C编码器(使用前一种格式)可以解释为什么他/她使用它而不是后者,这也是很好的.

Omn*_*ous 23

如果我冒险猜测,我会说这是因为C++人更有可能认为类型信息本身就是一个东西,因为模板可以在编译时以编程方式操作类型.它们也不太可能在同一个声明中声明几个变量.

T*方式侧重类型的信息在一个地方,使得它脱颖而出,将由东西推出类似的混乱T* foo, bar;与此语法是一个非问题,如果你从来没有声明在同一个语句两个变量.

就个人而言,我发现这种T*风格非常令人讨厌并且非常不喜欢它.它*是类型信息的一部分,它是真的,但编译器解析它的方式使它实际上附加到名称而不是类型.我认为这种T*方式模糊了正在发生的重要事情.

在我的观察中,似乎我在C++社区中很少见.我注意到你对最流行的风格有同样的看法.

当然,要明确这两种风格都适用于任何一种语言.但我确实注意到你做了同样的事情,一种风格在C代码中往往更常见,另一种在C++中更常见.

  • 我也使用`T*t`. (5认同)
  • 你不是一个罕见的人. (4认同)
  • 如果你认为代码对于星号的放置是"令人讨厌的",那么我认为你担心错误的事情. (4认同)
  • 在同一行上声明几个变量会使代码更难读,无论它们是否为指针.不要这样做:你真的不需要像70年代那样保存源代码保存的高清空间.如果这是人们将*放在变量名旁边的唯一原因,那么它就是一个非常差的. (3认同)

N.R*_*abh 16

来自Stroustrup的C++ Style and Technique FAQ.

"典型的C程序员"编写int *p;并解释它" *p是什么int"强调语法,并且可能指向C(和C++)声明语法来争论样式的正确性.实际上,它*p语法中的名称绑定在一起.

"典型的C++程序员"编写int* p;并解释它" p是指向int强调类型的指针".事实上,类型pint*.我显然更喜欢这种强调,并认为它对于使用C++的更高级部分非常重要.

  • 我喜欢这个答案,因为你没有试图用自己的意见来证明这一点.您呼吁的是那些或多或少是该主题权威的人. (2认同)

Bil*_*eal 14

就个人而言,我不同意这一点 - 我不认为有这样做的C或C++方式.我从未见过任何证据表明这一点.但是,我确实假设为什么星号的语法更靠近C中声明的变量名.

在C中(至少在C89中,绝大多数C在使用中),您必须在块的顶部声明所有变量.这导致程序员在做

T a, b, c;
Run Code Online (Sandbox Code Playgroud)

相对而言,在C++中,这种情况很少见.(在C++中,您声明变量接近于它们的使用位置,变量通常具有构造函数参数等;因此很少在一行上声明多个对象)

这也恰好是语法很重要的唯一情况,因为语句

T* a, b, c;
Run Code Online (Sandbox Code Playgroud)

声明一个指针,而不是程序员可能期望的三个.

由于在一行中放置多个声明在C中更常见,并且也是唯一一个星号位置很重要的情况,程序员更有可能将星号与变量相关联.

也就是说,我从未见过任何证据 - 这只是猜想.


Joh*_*itb 12

有几个人提到了非常好的观点.我只想指出,虽然C非常强烈地保留了"声明反映使用"的含义,但C++却没有.C++中的几个声明符不反映声明中的用法;

int &ref; // but "&ref" has type "int*", not "int".
int &&ref; // but "&&ref" is not valid at all.
Run Code Online (Sandbox Code Playgroud)

我不认为编写它的C++程序员实际上有这个原因,但它可能会阻止C++书籍作者提及它,这可能会影响那些C++程序员.


caf*_*caf 9

C程序员倾向于使用一种风格,而C++程序员使用其他风格的原因很简单:Kernighan和Ritchie在他们的书中使用了"C风格" ,而Stroustrup在他的书中使用了"C++风格" .


lit*_*adv 6

在K&R中,他们使用type *name符号,因此可能是许多C程序员得到它的地方.


fre*_*low 5

因为Bjarne有后见之明的好处:他意识到C声明符语法是"失败的实验"(读:C声明符语法被延迟).其他人已经得到了其他人的回答.