gpt4 book ai didi

c - `int const a[5]` 到底是什么意思?

转载 作者:太空狗 更新时间:2023-10-29 15:47:29 26 4
gpt4 key购买 nike

考虑以下数组声明:

int const a[5];

从语言的语义角度来看,它是否完全等同于const int a[5]?假设是这种情况,这两个声明本质上都像“a 是一个由 5 个常量 int 组成的数组”。

阅读第一个声明的另一种方法是“a 是一个包含 5 个整数的常量数组”。

显然,这两个语句在逻辑上都暗示整个数组是常量;如果数组由 5 个常量 int 组成,则整个数组是常量。或者,如果整个数组是常量,那么它的所有值也是常量。

我知道“常量数组”的概念有点毫无意义,因为数组不是可修改的左值(也就是说,它们不能出现在赋值的左侧)。但是,在任何情况下这两个声明会产生不同的行为吗?

(Cdecl.org 拒绝第一个声明作为语法错误,而大多数当前编译器接受它。)

编辑:

链接副本询问 const 的顺序是否对普通变量有影响。对于数组,它有点令人困惑,所以我不认为这是重复的。

最佳答案

is it exactly equivalent to const int a[5]

是的,是的。

The alternative way to read the first declaration would be "a is a constant array of 5 ints".

不是真的。如所写,您的声明专门将 const 应用于数组元素。为了将 const 应用到数组本身(而不是将它应用到数组元素),你必须做类似的事情

int (const a)[5];

但这样的声明在 C 中在句法上是无效的。

间接尝试将 const 应用于数组本身可以通过中间类型定义

typedef int A[5];
const A a;

但在这种情况下,根据语言规则,const 限定符“落空”到数组元素,整个事情等同于

const int a[5];

请再次注意,上面的 const A a; 并不立即等同于 const int a[5];。它实际上等同于前面提到的 int (const a)[5]; (!)。 (这是偷偷通过编译器防御的 int (const a)[5]; 的合法方法。)但是 int (const a)[5]; 非常-短暂存在 - 它立即被编译器转换为 const int a[5];

if an array consists of 5 constant ints, then the entire array is constant. Alternatively, if the whole array is constant, then all of its values are also constant.

嗯,这并不完全正确。 C 语言确实区分了数组对象本身及其元素。从概念上讲,这些是不同的实体。例如,正如您自己所说,语言规范规定数组是不可修改的左值。当然,这不会阻止数组元素可修改。

数组作为一个整体和单个数组元素之间的这种概念上的区别,加上 const 的“失败”行为正是导致以下令人不快的情况的原因

typedef int A[5];
A a;
const A *p = &a; // ERROR!!!

即它打破了允许我们用 T * 值初始化 const T * 指针的“正常”const 正确性规则。 (C++ 故意更新它的 const-correctness 规则以使上面的代码“按预期运行”,但 C 坚持拒绝它。)

关于c - `int const a[5]` 到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31412972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com