繁体   English   中英

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

[英]Why does `const` work on the thing immediately preceding it?

我正在学习C ++。 在我的课程中,我们解释说最好你想要不可改变的东西之后立即放置const ,因为这就是const工作方式。

许多人,包括比如Bjarne Stroustrup本人,都喜欢在前面写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)

一个显示此操作的示例:

int fun(int const *mypointer)
{
    *mypointer = 5; //Won't compile, because constant int.
    mypointer = 0; // Is okay, because modifiable pointer.
}

更令人困惑的是,像g ++这样的编译器喜欢在错误消息中将int const bar重写为const int bar

现在,这种行为让我非常困惑。 为什么const以这种方式工作? 如果它“只是”对它之后的东西起作用,那么理解起来会容易得多。

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 int重要( long long int一般情况下与long int不同),但单词的顺序不一样( long intint long相同)。 这就是为什么const int *pint const *p相同(以及const int iint const i相同)。

至于int * const p ,它可能不遵守常见的方案。 因为在C中没有像* const p (其中p是变量)这样的表达式,所以我们无法用“expression * const p将具有类型int ”之类的东西来解释它。 但是,想想,还有什么地方可以让const关键字指定指针本身是常量,而不是它的解引用值? (假设const int *pint const *p表示取消引用的值是常量,我们不希望在语言中引入其他关键字。)除了*之外没有其他地方。 所以在这里。

要理解C声明,有一个非常有用的右 - 左规则 :例如

int *

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

int &

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

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

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

注意:这个例子来自这篇文章 (但我稍微改了一下)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM