由于 sizeof 运算符评估操作数是否为 VLA,因此我尝试将其测试为:
#include<stdio.h>
int main(void)
{
int sz=20,i=0,j=0;
int arr[sz];
printf("%d\n",sizeof((++i,sz)));
printf("%d\n",sizeof((++j,arr)));
printf("%d\n%d\n",i,j);
}
Run Code Online (Sandbox Code Playgroud)
我认为我不会增加,因为 sz 不是 VLA,但 j 会增加,因为 arr 是 VLA。
但是在输出中, i 和 j 都没有增加。
引用我对另一个问题的回答:
“转换”是由于减法运算符。您可以使用逗号运算符看到类似的,也许更令人惊讶的结果:
Run Code Online (Sandbox Code Playgroud)printf("%zu\n", sizeof(1, a));
还将打印
sizeof(int *)
,因为逗号运算符导致在值上下文中使用。
基本上,由于逗号运算符的原因,类型 arr
是指针,VLA 的大小并没有出现在图片中。有关详细信息,请参阅我的链接答案。