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

Qqw*_*qwy 11 c c++ syntax const

我正在学习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)
Run Code Online (Sandbox Code Playgroud)

一个显示此操作的示例:

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

是什么让这个更加混乱,是编译器,如G ++想改写int const barconst int bar他们的错误消息.

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

Sas*_*sha 6

C++遵循C语法.

它看起来很奇怪,但是在C中你不是指定一种变量,而是指定一种表达式:

  • int v意思vint;
  • int *v意思*vint,v指针指向int;
  • int v[]意思v[…]int,所以v是数组int;
  • int v()意思v()int,v功能返回int;
  • 等(你总是需要从内部阅读这样的声明).

更贴近你的问题,在C型规格可以由几个单词:unsigned char,long int,const double(甚至两个以上- const unsigned long long int).重复单词的数量很重要(long long int一般情况下不同long int),但单词的顺序不long int相同(相同int long).这就是为什么const int *p是相同的int const *p(以及const int i相同的int const i).

至于int * const p,它可能不遵守共同的方案.因为在C中没有这样的表达式* const p(其中p是变量),所以我们无法用"表达* const p将具有类型int"之类的东西来解释它.但是,想想,我们还能在哪里放置const关键字来指定指针本身是常量,而不是它的解引用值?(假设两者const int *pint const *p意味着一个取消引用的值是固定的,我们不希望引入更多的关键字到语言.)无处后除外*; 所以在这里.