关闭

C++ sizeof 使用规则及陷阱分析(上)

发表于:2010-3-05 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
DotNet

  1、什么是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当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。

  2、sizeof的用法

  sizeof有两种用法:

  (1)sizeof(object)

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

  (2)sizeof(typename)

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

int i = 2;
cout<<sizeof(i)<<endl; // sizeof(object)的用法,合理
cout<<sizeof i<<endl; // sizeof object的用法,合理
cout<<sizeof 2<<endl; // 2被解析成int类型的object, sizeof object的用法,合理
cout<<sizeof(2)<<endl; // 2被解析成int类型的object, sizeof(object)的用法,合理
cout<<sizeof(int)<<endl;// sizeof(typename)的用法,合理
cout<<sizeof int<<endl; // 错误!对于操作符,一定要加()

  可以看出,加()是永远正确的选择。

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

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号