- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++ sizeof使用规则及陷阱分析
1什么是sizeof
首先看一下 sizeof在 msdn 上的定义:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (in cludi ng aggregate typ es). This keyword retur ns a value of type size_t.
看到return这个字眼,是不是想到了函数?错了, sizeof不是一个函数,你见过给一个
函数传参数,而不加括号的吗? sizeof可以,所以sizeof不是函数。网上有人说 sizeof是
元操作符,但是我并不这么认为,因为 sizeof更像一个特殊的宏,它是在编译阶段求值的。
举个例子:
coutsizeof(int)endl; // 32 位机上 int 长度为 4 coutsizeof(1==2)endl; // == 操作符返回 bool 类型,相当于 coutsizeof(bool)endl;
在编译阶段已经被翻译为:
cout4e ndl;
cout1e ndl;
这里有个陷阱,看下面的程序:
int a = 0; coutsizeof(a=3)e ndl; coutae ndl;
输出为什么是4,0而不是期望中的4, 3???就在于sizeof在编译阶段处理的特性。 由于sizeof不能被编译成机器码,所以 sizeof作用范围内,也就是()里面的内容也不能被编
译,而是被替换成类型。=操作符返回左操作数的类型,所以 a=3相当于int,而代码也被替
换为:
int a = 0; cout4e ndl; coutae ndl;
所以,sizeof是不可能支持链式表达式的,这也是和一元操作符不一样的地方。
结论:不要把sizeof当成函数,也不要看作一元操作符, 把他当成一个特殊的编译预处 理。
2、sizeof的用法
sizeof有两种用法:
(1) sizeof(object)
也就是对对象使用 sizeof,也可以写成sizeof object的形式。
(2) sizeof(typename)
也就是对类型使用 sizeof,注意这种情况下写成 sizeof typename是非法的。下面举几个
例子说明一下:
int i = 2;
coutsizeof(i)endl; // sizeof(object)的用法,合理 coutsizeof ie ndl; // sizeof object 的用法,合理 coutsizeof 2endl; // 2 被解析成 int 类型的 object, sizeof object 的用法,合理 coutsizeof(2)endl; // 2 被解析成 int 类型的 object, sizeof(object)的用法,合理 coutsizeof(int)endl;// sizeof(typename)的用法,合理 coutsizeof in te ndl; // 错误!对于操作符,一定要加 ()
可以看出,加()是永远正确的选择。
结论:不论sizeof要对谁取值,最好都加上 ()。
3、数据类型的sizeof
(1)C++固有数据类型
32 位 C++ 中的基本数据类型, 也就 char,short in t(short),i nt,lo ng in t(lo ng),float,double. Io ng
double
大小分别是:1,2,4,4,4,8, 10。
考虑下面的代码:
coutsizeof( un sig ned int) == sizeof( in t)e ndl; // 相等,输出 1
unsigned影响的只是最高位 bit的意义,数据长度不会被改变的。
结论:unsigned不能影响sizeof的取值。
(2)自定义数据类型
typ edef可以用来定义 C++自定义类型。考虑下面的问题:
typ edef short WORD;
typ edef long DWORD;
cout(sizeof(short) == sizeof(WORD))e ndl; // 相等,输出 1
cout(sizeof(lo ng) == sizeof(DWORD))e ndl; // 相等,输出 1
结论:自定义类型的 sizeof取值等同于它的类型原形。
(3)函数类型
考虑下面的问题:
int f1(){return 0;}; double f2(){return 0.0;} void f3(){} coutsizeof(f1())endl; // f1()返回值为 int,因此被认为是 int
coutsi
您可能关注的文档
最近下载
- 公路养护工程施工组织设计方案.pdf VIP
- 多囊卵巢综合征(最新指南PPT课件).pptx
- 2025年北京通州区招聘社区工作者和社区专职党务工作者考试笔试试题.pdf VIP
- 健康教育咨询模板.docx VIP
- 高压旋喷桩计算表.xls VIP
- 2025年池州安徽省江南产业集中区建设投资发展(集团)有限公司招聘8名笔试备考试题及答案解析.docx VIP
- 皖2015S209混凝土砌块式排水检查井.docx VIP
- 工匠精神大国工匠.pptx VIP
- 审计学(西南财经大学)中国大学MOOC 慕课 章节测验客观题答案.docx VIP
- 设施规划 教学课件 ppt 作者 周宏明 第2章 设施选址.pptx VIP
原创力文档


文档评论(0)