c++ sizeof使用

http://dev.yesky.com/143/2563643.shtml
什么是sizeof 

  首先看一下sizeof在msdn上的定义: 

  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. 

  看到return这个字眼,是不是想到了函数?错了,sizeof不是一个函数,你见过给一个函数传参数,而不加括号的吗?sizeof可以,所以sizeof不是函数。网上有人说sizeof是一元操作符,但是我并不这么认为,因为sizeof更像一个特殊的宏,它是在编译阶段求值的。举个例子:

cout<<sizeof(int)<<endl; // 32位机上int长度为4
cout<<sizeof(1==2)<<endl; // == 操作符返回bool类型,相当于 cout<<sizeof(bool)<<endl;

  在编译阶段已经被翻译为: 

cout<<4<<endl;
cout<<1<<endl;

  这里有个陷阱,看下面的程序: 

int a = 0;
cout<<sizeof(a=3)<<endl;
cout<<a<<endl;

  输出为什么是4,0而不是期望中的4,3???就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码,所以sizeof作用范围内,也就是()里面的内容也不能被编译,而是被替换成类型。=操作符返回左操作数的类型,所以a=3相当于int,而代码也被替换为: 

int a = 0;
cout<<4<<endl;
cout<<a<<endl;

  所以,sizeof是不可能支持链式表达式的,这也是和一元操作符不一样的地方。 

  结论:不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。 


 
1. sizeof 操作符的结果类型size_t,它在头文件中typedef为unsigned int类型: typedef unsigned int size_t.
    2. sizeof是是长度运算符, 获得数据类型或是变量的长度,如果是数据类型,则返回数据类型大小,如果是用数组,则返回数组所占空间大小,strlen是计算字符串长度的函数,返回的是实际串长度,以char* 作参数 ,且必须是以'\0'结尾。
    3. sizeof在编译的时候就把计算过,strlen的结果要在运行的时候才能计算出来。
    4. 数组做长度运算符sizeof的参数不退化。数组做函数strlen的参数就退化为指针了,因为数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。
 char* ss = "0123456789";
 cout<<sizeof(ss)<<endl;//4
 cout<<sizeof(*ss)<<endl;//1
 cout<<strlen(ss)<<endl;//10
 char ss1[] =  "0123456789";
 cout<<sizeof(ss1)<<endl;//11
 cout<<sizeof(*ss1)<<endl;//1
 cout<<strlen(ss1)<<endl;//10
 char ss2[100] =  "0123456789";
 cout<<sizeof(ss2)<<endl;//100
 char ss3[] = "0123456789\n";
 cout<<sizeof(ss3)<<endl;//12
 int n[4] = {1,2,3,4};
 cout<<sizeof(n)<<endl;//16
int n1= 1234;
cout<<sizeof(n1)<<endl;//4

你可能感兴趣的:(C++)