加入收藏 收藏网站 设为首页 设为首页
招生考试网
学历类| 阳光高考 研 究 生 自学考试 成人高考 专 升 本 中考会考 外语类| 四 六 级 职称英语 商务英语 公共英语 日语能力
资格类| 公 务 员 报 关 员 银行从业 司法考试 导 游 证 教师资格 财会类| 会 计 证 经 济 师 会计职称 注册会计 税 务 师
工程类| 一级建造 二级建造 造 价 师 造 价 员 咨 询 师 监 理 师 医学类| 卫生资格 执业医师 执业药师 执业护士 国际护士
计算机| 等级考试 软件水平 应用能力 其它类| 书画等级 美国高考 驾 驶 员 书法等级 少儿英语 报 检 员 单 证 员 出国留学
 招生考试网 - 计算机等级考试 - 考试辅导 - 正文

 
计算机二级C语言:C++sizeof使用规则及陷阱分析(1)
来源:fjzsksw.com 2009-11-6 编辑:yangmeiling 【字体:小 大】

一、什么是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更像一个特殊的宏,它是在编译阶段求值的。举个例子:

  1 cout<<sizeof(int)<<endl; // 32位机上int长度为4

  2  cout<<sizeof(1==2)<<endl; // == 操作符返回bool类型,相当于 cout<<sizeof(bool)<<endl;

  3

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

  1 cout<<4<<endl;

  2 cout<<1<<endl;

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

  1 int a = 0;

  2 cout<<sizeof(a=3)<<endl;

  3 cout<<a<<endl;

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

  int a = 0;

  cout<<4<<endl;

  cout<<a<<endl;

  1 cout << sizeof("abcd") << endl;//5

  "abcd"返回是字符串类型

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

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

  二、sizeof的用法

  sizeof有两种用法:

  (1)sizeof(object)或sizeof object

  也就是对对象使用sizeof,也可以写成sizeof object 的形式。例如:

  (2)sizeof(typename)

  也就是对类型使用sizeof,注意这种情况下写成sizeof typename是非法的。下面举几个例子说明一下:

  1 int i = 2;

  2  cout<<sizeof(i)<<endl; // sizeof(object)的用法,合理3  cout<<sizeof i<<endl; // sizeof object的用法,合理4  cout<<sizeof 2<<endl; // 2被解析成int类型的object, sizeof object的用法,合理5  cout<<sizeof(2)<<endl; // 2被解析成int类型的object, sizeof(object)的用法,合理6  cout<<sizeof(int)<<endl;// sizeof(typename)的用法,合理7  cout<<sizeof int<<endl; // 错误!对于操作符,一定要加()可以看出,加()是永远正确的选择。

  结论:不论sizeof要对谁取值,最好都加上()。

  三、基本数据类型的sizeof

  (1)C++内置数据类型

  32位C++中的基本数据类型,

  bool char short int(short) int long int(long) float double long double

  sizeof 1 1 2 4 4 4 8 10

  char,short int(short),int,long int(long),float,double, long double大小分别是:1,2,4,4,4,8, 10。



 
网站版权与免责声明
①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
最新文章
热门文章

报名考试
全国 | 黑龙江 | 吉林 | 辽宁 | 内蒙古
青海 | 宁夏 | 甘肃 | 新疆 | 陕西
西藏 | 北京 | 天津 | 河北 | 山东
江苏 | 安徽 | 河南 | 上海 | 浙江
福建 | 广东 | 山西 | 湖南 | 湖北
江西 | 广西 | 海南 | 云南 | 贵州
四川 | 重庆
分省高校计算机考试
黑龙江 | 吉林 | 辽宁 | 内蒙古 | 河北
北京 | 天津 | 新疆 | 甘肃 | 宁夏
青海 | 陕西 | 山西 | 河南 | 山东
江苏 | 安徽 | 浙江 | 福建 | 广东
海南 | 广西 | 江西 | 湖北 | 湖南
四川 | 上海 | 重庆 | 贵州 | 云南
西藏
成绩查询
报考指南
试题答案
模拟试题
考试辅导
计算机一级 | 计算机二级 | 计算机三级 | 计算机四级
经验交流
高校计算机