什么是 VLA 类型的表达式?

What is an expression of VLA type?

我试图了解 sizeof 运算符的工作原理,我遇到了 题。以下是该问题的代码

#include <stdio.h>

int main() {
    int i = 0;
    int a[i];
    printf("%zu\n",sizeof(a[i++]));
    printf("%d\n",i); // Here, print 0 instead of 1
    return 0;
}

这里的数组 a 是可变长度的,但是当它用作 sizeof 运算符的操作数时,变量 i 不会递增。

一些评论和回答说 a[i++] 不是 VLA 类型,并建议 op 应该使用 2D VLA 来查看副作用( sizeof 评估其操作数)。

我不太明白为什么 a[i++] 不符合 VLA 表达式的条件。我认为这与我们可以不指定数组的第一个维度这一事实有关在传递给函数时。

所以问题是一般来说什么被认为是 VLA 表达式?

I don't clearly understand why a[i++] doesn't qualify as a VLA expression

a[n] 不是 VLA 表达式,即使 a 是 VLA,因为表达式生成 VLA 的单个元素,而不是 VLA 本身。

in general what is considered a VLA expression?

在您的示例中,a 将是一个 VLA 表达式,因为它表示一个 variable-length 数组。

2D VLA 会给你一个场景,其中 sizeof 会计算它的操作数:

int x, y;
scanf("%d %d", &x, &y);
int a[x][y];
int i = 0;
size_t z = sizeof(a[i++]);
printf("%d %d\n", i, (int)z);

这会打印 1,因为现在不仅 a 是一个 VLA,而且 a[n] 也是一个 VLA (demo)。