奇怪的C常量声明

时间:2013-12-05 13:58:49

标签: c constants

我真的无法理解这里的区别是什么

const int a = 1;
int const a = 1;

我知道常数是什么,但上面的例子让我很困惑。

4 个答案:

答案 0 :(得分:7)

没有区别。两者都是一样的。

草案n1570:6.7.2类型说明符:

  

类型说明符包括voidcharshortintlongfloatdouble,{{ 1}},signedunsigned_Bool_Complex<struct-or-union-specifier><enum-specifier>

     

每个声明中的声明说明符中应至少提供一个类型说明符,并在每个结构声明和类型名称的说明符限定符列表中指定。每个类型说明符列表应为以下多个集合之一(以逗号分隔,每个项目有多个多集); 类型说明符可以按任何顺序出现 1 ,可能与其他声明说明符混合。


1.Emphasis is mine

答案 1 :(得分:7)

在这个特殊情况下,它们是相同的。

但是,我认为值得注意的是,当指向指针时,的排序很重要:

const int * a;       // pointer to constant int
int const * a;       // pointer to constant int
int * const a;       // constant pointer to int
int const * const a; // constant pointer to constant int

答案 2 :(得分:2)

在您的情况下,这些陈述是同义词。 C中的修饰符适用于左侧说明符,除非没有。当你有指针时,这会更有意义。

int const a;

定义常量变量a

int const * a;

定义了一个指向const变量的可修改指针。

int * const a;

定义了一个指向可修改变量的const指针。

答案 3 :(得分:0)

正如其他人所说,你的两个代码示例是相同的。

记住如何解析这些表达式的简单方法是:

  • 如果const旁边(两侧)出现 typename ,就像在您的示例中一样,const会绑定到类型名称。
  • 否则,const将绑定到左侧的第一个指针。

例如,int * const p是指向非常量int的常量指针,这意味着您可以使用int写入p,但无法更改价值p

记住类型名称旁边的const是否绑定到左侧或右侧指针的一种方法是考虑类型int * const p的表达式是否合法的事实,以及所以此表达式中的const必须绑定到左侧的指针。你仍然需要记住const更喜欢指针的类型名。