====== 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语言}}