为什么C ++类型表达式不是从左到右解释的?

时间:2015-02-23 00:08:20

标签: c++ pointers language-lawyer

例如,我通常将int const * const *向后读作“指向常量整数的常量指针”。为什么C ++不希望它像* const * const int一样从左到右。如果将语言更改为此样式,是否会导致与其他C ++语言功能的兼容性问题?

我知道像const这样的限定符可以出现在基类型的任何一侧。星号和随后的争用的一面是我真正追求的。

4 个答案:

答案 0 :(得分:4)

解释指针语法背后的基本原理最好用Kernighan& amp; Ritchie自己(K& R,第一版,第90页):

  

int * px;用作助记符:它表示组合* px   是一个int,即如果px出现在上下文* px中它等效于   可以使用int类型。实际上声明的语法   变量模仿变量可以表达的语法   出现。

与您假设的反向语法相关的其他评论:

  • 标准语法允许混合指针和非指针:int a,*px, atoi(char*);这在您的反向语法中是不可能的。
  • 此标准语法允许以一致的方式组合指针和数组:char *s[10]是一个包含10个指向char的指针的数组。你的反转语法是什么:[10]* char s* char s[10]?如果将第二个维度添加到数组中,它会保持一致吗?
  • 最后,您如何在倒置语法中如意地声明像char *(*f)(int)这样的函数指针?

答案 1 :(得分:3)

它最终来自这样一个事实,遗憾的是*是一个前缀运算符,可能来自B,BCPL等。比较Pascal,其中defererence运算符是^并且是后缀。如果C *运算符是后缀:

  • 指向函数的语法可以理解,不需要括号
  • ->运算符不是必需的:相反,您只需编写ptr*.member

答案 2 :(得分:2)

它来自C,其中编写类型以模仿具有相同装饰的表达式的值类型。表达式*p的类型是什么?

答案 3 :(得分:0)

将星号分配给变量。指针不是特殊类型,而是变量的特殊行为。 所以

int *a, b;

意味着,a是指向整数的指针,而b只是整数。 两个整数都是:

int *a, *b;

根据你的建议,这种理解将会消失。但是你可以使用C ++ 11中引入的智能指针。