根据参考参数 http://en.cppreference.com/w/c/language/sizeof:
如果类型为表达 is a 变长数组 type, 表达被评估并计算其求值的数组的大小
在运行时。
这意味着:如果类型表达是一个VLA类型,那么表达被评估。例如:
#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;
}
所以,根据参考资料,这里i
变成1
。但是,使用我的 GCC 编译器,i
打印为0
.
See 魔盒演示 https://wandbox.org/permlink/u15UOXihrmkO2Ct6.
首先,请注意数组的大小不能为零,无论是否为 VLA。所以你的代码会调用未定义的行为。
C11 6.7.6.2/5
“如果大小是一个不是整数常量表达式的表达式:” /--/ “...每次计算时,它的值都应大于零。”
至于实际问题,a[i++]
属于类型int
,不是 VLA 类型。
为了获得副作用,必须涉及VLA数组类型本身,例如sizeof(a)
。只有这样,才会评估操作数的副作用。举一个例子来说明这一点:
#include <stdio.h>
int main() {
int i=1, j=1;
int a[i][j];
int b[1][1];
(void) sizeof(a[--i]);
(void) sizeof(b[--j]);
printf("%d %d", i, j);
return 0;
}
Here i
从第一次开始最终为 0sizeof
由于VLA而被评估,但是j
仍为 1,因为--j
是一个的一部分sizeof
对于常规数组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)