在这种情况下 sizeof 是如何工作的?

How does sizeof wоrk in this case?

看下面的代码:

#include <stdio.h>

int main(void) 
{
    int i = 1;
    printf("%lu\n", sizeof(int[++i]));
    printf("%d", i);
}

我正在测试 sizeof 运算符,因为对可变长度数组类型的操作数进行了求值 — 如果有人也对此进行澄清,我会很高兴,但问题不同.

6.5.3.4/2

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。大小由操作数的类型决定。结果是一个整数。 如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数并且结果是整数常量.

以上代码在GCC上的输出如下:

8
2

谁能解释一下这个8是从哪里来的?数组会衰减为指针吗? 也请对可变长度数组部分进行说明。

一个int是4个字节长。您正在向 sizeof 运算符传递长度为 2 的 int 数组。要存储 2 的 int 数组,您需要 2x4 = 8 字节。

++i

在使用之前将 i 的值从 1 增加到 2。这就是为什么你的输出是 8 和 2。

在评估 int[++i] 时,i 最初的值为 1。因此 int[++i] 评估为 int[2],即 int 的数组尺寸 2。

假设一个 int 在你的系统上是 4 个字节,这个数组的大小是 8 个字节。