====== Sizeof的几点事项 ======
标准C定义了一个无符号类型size_t,作为sizeof操作符的返回值类型。
当sizeof的操作数是表达式时,通常不进行[[.:type_conversions|类型转换]],所以当操作数是数组时,sizeof能获得数组的大小,而不是数组转换为的指针的大小。但如果表达式中包含其他操作符,需要进行类型转换后才能决定表达式size时,则将进行类型转换。
例如:
short s = 4;
printf("%ld\n", sizeof(s + 0));
这里sizeof(s + 0)=sizeof(int),因为s+0导致short提升为int。
此外,当sizeof的操作数是表达式时,对表达式的分析是在编译阶段进行的,也就是说该表达式并不进行计算。如:
int i = 1;
printf("%ld\n", sizeof(i++));
这里i的值依旧为1,而不是2。
但对于变长数组(variable length array),如果数组大小表达式影响sizeof的计算结果,则该表达式必须先计算;如果不影响,则该表达式可算可不算。如:
int n = 10;
int a[n++];
这里n的值为11。
而:
static int f(int *n)
{
return ++(*n);
}
int main(void)
{
int n = 10;
printf("%ld\n", sizeof(int (*)[f(&n)]));
}
这里n的值可为10,也可为11,因为f()不影响sizeof的结果。
{{tag>C语言}}