sizeof:那些不为人知的小秘密

mac2026-08-07  10

sizeof()到底是什么?

每当人们在一段代码中看到**sizeof()**时,许多人总是会认为这是一个库自带的函数,那它真就是一个函数吗?我们首先来看一下比较官方的解释: The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including aggregate types). This keyword returns a value of type size_t. 那 sizeof到底是什么? sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。 其返回值类型为size_t,在头文件<stdio.h>中定义 所以请记住:sizeof为操作数,而且是单目操作数,它并不是一个函数。

我们来看一下sizeof有哪些不为人知的小秘密

1.sizeof后需不需要加小括号()?

1.当sizeof的操作数是类型时必须加括号();

#include <stdio.h> int main(){ printf("%d\n",sizeof(int)); printf("%d\n",sizeof(double)); }

而当sizeof的操作数是常量时,可以不用加小括号();

printf("%d\n",sizeof 'a'); char c = '\n'; printf("%d\n",sizeof c);

2.当sizeof的操作数是表达式时,需要加括号();

1 #include <stdio.h> 2 3 int main(){ 4 printf("%d\n",sizeof 'a'+'a'); 5 printf("%d\n",sizeof('a'+'a')); 6 return 0; 7 }

我们发现当操作数为表达式且不加括号时,则直接sizeof直接返回’a’的字节,而且是以整型int 的形式,再加上后面’a’代表的97,最终结果为101。而当加了括号后结果就明显不同了。

2.sizeof只会关心返回表达式的结果的类型,并不会计算表达式。

1 #include <stdio.h> 2 3 int main(){ 4 int a=0,b=0; 5 printf("%d\n",sizeof(++a+ ++b)); 6 printf("%d\n%d\n",a,b); 7 return 0; 8 }

3.当sizeof后面的操作数为单独的字符或者字符运算时,编译时系统会把这个字符看成int整型,小数浮点型默认为double类型,但是如果是经过定义的char型或者float型 变量,则返回该类型的字节大小。

1 #include <stdio.h> 2 3 int main(){ 4 printf("%d\n",sizeof 'c'); 5 printf("%d\n",sizeof('a'+'a')); 6 char s = 'a'; 7 printf("%d\n",sizeof s); 8 printf("%d\n",sizeof(s+'a')); 9 float f = 3.14; 10 printf("%d\n",sizeof 3.14); 11 printf("%d\n",sizeof f); 12 printf("%d\n",sizeof 4ll); 13 return 0; 14 }

直接在常量后面加ll,f等也可以改变数据的类型。

4.如果sizeof后面的操作数是多类型的表达式时,则返回的结果是最宽字节类型的字节

1 #include <stdio.h> 2 3 int main(){ 4 char c='a'; 5 printf("%d\n",sizeof c); 6 printf("%d\n",sizeof 4); 7 printf("%d\n",sizeof(c+5+4.5)); 8 return 0; 9 }

5.如果sizeof后面的操作数为函数时

1.如果函数不带小括号(),则返回的结果始终为 1

2.如果函数名有小括号(),则返回结果等于函数返回值类型的字节宽度

1 #include <stdio.h> 2 3 short school(){ 4 return 5; 5 } 6 char character(){ 7 8 return 'c'; 9 } 10 int integer(){ 11 return 5; 12 } 13 double doub(){ 14 return 3.14; 15 } 16 int main(){ 17 18 printf("%d\n",sizeof(school)); 19 printf("%d\n",sizeof(school())); 20 printf("%d\n",sizeof(character)); 21 printf("%d\n",sizeof(character())); 22 printf("%d\n",sizeof(integer)); 23 printf("%d\n",sizeof(integer())); 24 printf("%d\n",sizeof(doub)); 25 printf("%d\n",sizeof(doub())); 26 return 0; 27 }

6.当sizeof的操作数为指针时,其返回的结果恒为4;

1 #include <stdio.h> 2 3 int main(){ 4 printf("%d\n",sizeof(int*)); 5 printf("%d\n",sizeof(char*)); 6 printf("%d\n",sizeof(double**)); 7 int a = 0; 8 char c = 'a'; 9 double d = 3.14; 10 printf("%d\n",sizeof &a); 11 printf("%d\n",sizeof &c); 12 printf("%d\n",sizeof &d); 13 return 0; 14 }

总结:sizeof不是函数,是运算符;sizeof不是函数,是运算符;sizeof不是函数,是运算符;重要的事情说三遍!!

最后:学无止境,学习是武装自己最好的武器!

最新回复(0)