[英]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
表示v
为int
; int *v
表示*v
是int
,所以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 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
是变量)这样的表达式,所以我们无法用“expression * const p
将具有类型int
”之类的东西来解释它。 但是,想想,还有什么地方可以让const
关键字指定指针本身是常量,而不是它的解引用值? (假设const int *p
和int const *p
表示取消引用的值是常量,我们不希望在语言中引入其他关键字。)除了*
之外没有其他地方。 所以在这里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.