【问题标题】:Why does c++ pointer * associate to the variable declared, not the type?为什么 c++ 指针 * 关联到声明的变量,而不是类型?
【发布时间】:2012-06-14 12:11:43
【问题描述】:

为什么 C++ 被设计成在同一行声明两个 int *s 的正确方法是

int *x, *y;

不是

int* x,y;

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

【问题讨论】:

标签: c++ pointers language-design declaration


【解决方案1】:

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

Bjarne 提出了一个很好的观点in his style and technique faq

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

一个典型的 C 程序员写 int *p; 并解释它 *p is what is the int 强调语法,并可能指向 C(和 C++)声明语法来争论风格的正确性。事实上,* 绑定到语法中的名称 p。

typical C++ programmerint* p; 并解释它 p is a pointer to an int 强调类型。实际上 p 的类型是 int*。我显然更喜欢这种强调,并认为这对于很好地使用 C++ 更高级的部分很重要。

因此,在 C++ 中像 this 这样工作的动机是它在 C 中的工作方式。

它在 C 中工作的动机是,如上所述,C 强调表达式而不是类型。

【讨论】:

  • @illEatYourPuppies 啊,但这是一个完全不同的问题:P
  • @LuchianGrigore 仅在您没有任何好奇心的情况下:)
  • 我通常使用int * p,因为我觉得这两种方式都很丑:)
  • @nijansen 这是最丑的,我读到“计算intp 的乘积(乘法)”!
  • 您必须注意到 Bjarne 的最后一段是错误的。我从未见过 C++ 程序员这样做,这与实际含义不符。考虑 OP 的例子: int* p,q;并不意味着 q 是一个指向 int 的指针。
【解决方案2】:

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

C 早期的原始哲学是声明是精确的 使用的形象。所以当你写的时候:

int *p;

,您声明表达式*p 的类型为int(并且 编译器相应地计算出p 的实际类型)。

当然,这在 C 引入 typedef 的那一天就不再正确了,并且 后来struct。与const 的任何相似之处都完全消失了 (首先在 C++ 中引入,然后在 C 中进行了改进),例如

int *const p;

与使用无关。但到那时,死定了。

【讨论】:

    【解决方案3】:

    回答

    这来自“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;
    

    我更喜欢这种技术。

    干杯。

    【讨论】:

      猜你喜欢
      • 2019-11-04
      • 2014-02-17
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      相关资源
      最近更新 更多