sizeof 小结

来源:互联网 发布:python jupyter 编辑:程序博客网 时间:2024/06/04 19:27

 古人云:万事预则立,不预则废。所以,最近看了好多面试题。现在把有关sizeof的知识总结一下,大部分内容是从网上所搜出来的,写在这里只是为了做了记录,如果正好触碰到您的原版权,见谅!

首先,sizeof倒是什么?在许多关于c/c++的语法书籍中,我们会看到sizeof和诸如+,-,×等这些操作符放在一起,而且还有优先级。sizeof是一元操作符,它的作用是返回操作数的大小,以字节为单位。它的语法形式如:sizeof(type-name),例证:

#include <iostream>

using namespace std;

int main(int argc,char*argv[])
{
 cout<<sizeof(int)<<endl;
}

输出的结构:4

sizeof貌似是一个函数:有参数,有返回值。但,千万别误导。其实,它还有一种语法形式:sizeof unary-expression,例证:

#include <iostream>

using namespace std;

int main(int argc,char*argv[])
{
 int a = 0;
 cout<<sizeof a<<endl;
}

输出的结果:4

你见过,不带函数调用符的函数调用吗?没有。所以,sizeof不是一个函数。与其说它是一个一元操作符,还不如说它是一个宏,因为它是在编译阶段求值的。我们在代码中输入cout<<sizeof(1==1)<<endl;相当于输入了cout<<sizeof(bool)<<endl;如果我们这样写会输出怎么的结果呢?

#include <iostream>

using namespace std;

int main(int argc,char*argv[])
{
 int a = 0;
 cout<<sizeof(a = 3)<<endl;
 cout<<a<<endl;
}

输出结果:4 0

是不是和你想的一样呢?出现这样的结果,就在于sizeof是在编译阶段处理的。由于sizeof不能被编译成机器码,所以sizeof作用范围内,也就是()里面的内容也不能被编译成,而是被替换成类型。=操作符返回左操作数的类型,所以a = 3相当于int,而代码也被替换为:

#include <iostream>

using namespace std;

int main(int argc,char*argv[])
{
 int a = 0;
 cout<<sizeof(int)<<endl;
 cout<<a<<endl;
}

所以在使用sizeof的时候,只看()内表达式的返回类型,然后用返回类型把原参数替换,再去编译。

sizeof有两种用法:

1.sizeof(object)也就是对对象使用sizeof,也可以写成sizeof object的形式。

2.sizeof(type-name),注意这种情况下写成sizeof type-name是非法的。

 

原创粉丝点击