考虑以下数组声明:
从语言的语义角度来看,它是否与
另一种阅读第一个声明的方式是 "a 是一个由 5 个整数组成的常量数组"。
显然,这两个语句逻辑上都意味着整个数组是常量;如果一个数组由 5 个常量整数组成,则整个数组都是常量。或者,如果整个数组是常量,则它的所有值也都是常量。
我知道“常量数组”的概念有点无意义,因为数组不是可修改的左值(即它们不能出现在赋值语句的左边)。但是,在哪些情况下这两个声明会产生不同的行为?
(Cdecl.org 将第一个声明拒绝为语法错误,而大多数当前编译器则接受它。)
编辑:
链接的重复问题问普通变量的 const 顺序是否重要。对于数组来说,它更加令人困惑,所以我不认为这是一个重复的问题。
int const a[5];
从语言的语义角度来看,它是否与
const int a[5]
完全等价?假设是这样的话,这两个声明本质上都可以理解为 "a 是一个由 5 个常量整数组成的数组"。另一种阅读第一个声明的方式是 "a 是一个由 5 个整数组成的常量数组"。
显然,这两个语句逻辑上都意味着整个数组是常量;如果一个数组由 5 个常量整数组成,则整个数组都是常量。或者,如果整个数组是常量,则它的所有值也都是常量。
我知道“常量数组”的概念有点无意义,因为数组不是可修改的左值(即它们不能出现在赋值语句的左边)。但是,在哪些情况下这两个声明会产生不同的行为?
(Cdecl.org 将第一个声明拒绝为语法错误,而大多数当前编译器则接受它。)
编辑:
链接的重复问题问普通变量的 const 顺序是否重要。对于数组来说,它更加令人困惑,所以我不认为这是一个重复的问题。
const
应用于其左侧的类型,除非它是声明中的第一个,此时它应用于右侧。因此两者是等价的。 - bolovconst int a[5];
时,它会在C++
中给你一个常量数组。请注意,这在C
中不起作用(正确)。所以对于C
来说,它几乎被忽略了。 - Wolpha
是一个由5个const int组成的数组。改变顺序会使a
成为一个由5个int const组成的数组,这是没有意义的,但是C语言允许您将const放在第一位,因为语言设计者混淆了概念,并尽力传播这种混淆。 - Jim Balter