为什么`const`在它之前的东西上工作?

时间:2016-10-07 08:14:36

标签: c++ c syntax const

我正在学习C ++。在我的课程中,我们解释说,最好在之后立即将<{1}}放置在您想要变更的东西上,因为这就是const的工作方式。

许多人,包括比如Bjarne Stroustrup本人,都喜欢在前面写const。但这有时会导致问题:

const

显示此操作的示例:

const int *foo; //modifiable pointer to a constant int. 
int const *bar; //constant pointer to a modifiable int? No! It's a modifiable pointer to a constant int. (So the same type as foo)

让这更令人困惑的是,像g ++这样的编译器喜欢在错误消息中将int fun(int const *mypointer) { *mypointer = 5; //Won't compile, because constant int. mypointer = 0; // Is okay, because modifiable pointer. } 重写为int const bar

现在,这种行为让我非常困惑。为什么const int bar以这种方式工作?如果它只是&#39;只是&#39;它似乎要容易理解。把事情放在后面。

2 个答案:

答案 0 :(得分:6)

C ++遵循C语法。

看起来很奇怪,但是在C语言中你指定的是不是变量的类型,而是一种带有它的表达式

  • int v表示vint;
  • int *v表示*vint,因此v指向int;
  • int v[]表示v[…]int,因此vint的数组;
  • int v()表示v()int,因此v是返回int的函数;
  • 等(你总是需要从内部阅读这样的声明)。

更接近您的问题,在C类型规范中可以包含多个单词:unsigned charlong intconst double(甚至超过两个 - const unsigned long long int)。重复单词的数量(一般情况下long long intlong int不同),但单词的顺序不同(long intint long相同)。这就是为什么const int *pint const *p相同(以及const int iint const i相同)。

至于int * const p,它可能不遵守常用方案。因为在C中没有* const p(其中p是变量)这样的表达式,所以我们无法用“expression * const p之类的东西来解释它。 {1}}“。但是,想想,我们还能在哪里放置int关键字来指定指针本身是常量,而不是它的解引用值? (假设constconst int *p都表示取消引用的值是常量,我们不希望在语言中引入其他关键字。)除了int const *p之外,没有任何其他关键字。所以就在这里。

答案 1 :(得分:1)

要理解C声明,有一个非常有用的Right-Left rule:例如

int *

是指向整数的指针(请注意,您必须从右到左阅读)。同样可以参考int:

int &

现在从右到左阅读p8的类型:

char * const * const p8; //  const pointer to const pointer to char

我怀疑const修改了前面的类型,只是为了与该规则保持一致。您可以将const放在声明的最开头这一事实是一个例外。

注意:示例来自this article(但我稍微改了一下)。