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

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不是函数,是运算符;重要的事情说三遍!!

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

发布了14 篇原创文章 · 获赞 84 · 访问量 2801

猜你喜欢

转载自blog.csdn.net/weixin_42617375/article/details/102872548