gpt4 book ai didi

c - 初始化期间表示数组大小的有效和无效语法

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

我目前正在研究 c 数组,并且对什么可以和不能用于在初始化期间表示数组的大小感到困惑。

我的假设是否正确

#define SIZE 5 

const int SIZE = 5; 

彼此之间有根本的不同吗?

他们有他们的区别,一个让我感到困惑的特殊例子是

#define SIZE 5
int arr[SIZE] = {11, 22, 33, 44, 55};

是有效语法,但是

const int SIZE = 5;
int arr[SIZE] = {11, 22, 33, 44, 55};

不是有效语法。虽然很有趣,

const int SIZE = 5;
int arr[SIZE];

是有效语法。

特定语法有效或无效背后的逻辑是什么?

最佳答案

Am I right to assume

#define SIZE 5
and
const int SIZE = 5;

are fundamentally different to one another?

是的,你是对的。

#define 只是一个 textual replacement .基本上,C 预处理器会在编译过程(处理阶段)中为您“查找和替换”。而 const 限定对象意味着“存储在该位置的东西不能改变”——大致相当于说它是“只读的”。


#define SIZE 5
int arr[SIZE] = {11, 22, 33, 44, 55};

is valid syntax.

这完全等同于写作:

int arr[5] = {11, 22, 33, 44, 55}; 

你自己。当您使用 define 时,编译器会简单地为您完成替换工作。


const int SIZE = 5;

int arr[SIZE] = {11, 22, 33, 44, 55};

is not valid syntax.

它是无效的,但原因可能不止一个。如果 arr 具有静态存储持续时间(即对象 arr 在整个程序执行期间都处于事件状态),则它是无效的。因为 C 要求静态存储持续时间的数组对象的大小为 constant expression :

If the size is an integer constant expression and the element type has a known constant size, the array type is not a variable length array type; otherwise, the array type is a variable length array type.

所以,下面的程序是无效的:

const int SIZE = 5;
int arr[SIZE] = {11, 22, 33, 44, 55};
int main(void)
{
}

因为 SIZE 在 C 中不符合“常量表达式”的条件。请注意,这在 C++ 中完全有效,其中 SIZE 符合常量表达式的条件(两个这里的语言不同)。

另一个原因是 C 标准不允许初始化可变长度数组。如果您在函数中有定义,例如:

The type of the entity to be initialized shall be an array of unknown size or a complete object type that is not a variable length array type.

所以如果你没有初始化器那么它就有效了:

int main(void)
{
const int SIZE = 5;
int arr[SIZE]; /* This is OK */
}

同样,您也可以不使用 const:

int main(void)
{
int SIZE = 5;
int arr[SIZE]; /* Thi is OK too. */
}

在上面的两个片段中,arr 只是一个 variable-length array .

Though interestingly,

const int SIZE = 5; int arr[SIZE];

is valid syntax.

它只有在函数内部时才有效(如上所述)——它是一个 VLA。但是,如果您让它具有静态存储持续时间,例如:

const int SIZE = 5;
int arr[SIZE]; /* arr has static storage duration just as
all objects defined at file scope */

int main(void)
{
}

它是无效的,因为如上所述,SIZE 不是 "constant expression"在 C 中。

同样,

int main(void)
{
const int SIZE = 5;
static int arr[SIZE]; /* arr has static storage duration */
}

出于同样的原因无效,尽管 arr 在函数内部,因为 arr 具有静态存储持续时间


但是,如果您有:

enum {SIZE = 5};
int arr[SIZE] = {11, 22, 33, 44, 55};
int arr2[SIZE]; /* Valid without initializer too. */

int main()
{
}

这是有效的。为什么?因为enum constants qualify as "constant expressions"在 C 中。

关于c - 初始化期间表示数组大小的有效和无效语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48981070/

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