C++Primer学习(4.9和4.10 sizeof运算符和逗号运算符)

4.9 sizeof运算符
sizeof运算符返回一条表达式或一个类型名字所占的字节数。sizeof 运算符满足右结合律,其所得的值是一个size_t类型(参见3.5.2节,第103页)的常量表达式(参见2.4.4节,第58页)。运算符的运算对象有两种形式:
sizeof (type)
sizeof expr
在第二种形式中,sizeof返回的是表达式结果类型的大小。与众不同的一点是,sizeof并不实际计算其运算对象的值:

Sales_data data,*p;
sizeof(Sales_data);//存储Sales_data类型的对象所占的空间大小
sizeof data; //data的类型的大小,即sizeof(Sales_data)
sizeof p;//指针所占的空间大小
sizeof*p;//p所指类型的空间大小,即sizeof(Sales_data)
sizeof data.revenue;//Sales_data的revenue成员对应类型的大小
sizeof Sales_data::revenue;//另一种获取revenue 大小的方式

这些例子中最有趣的一个是sizeof *p。首先,因为sizeof 满足右结合律并且与 * 运算符的优先级一样,所以表达式按照从右向左的顺序组合。也就是说,它等价于sizeof(*p)。其次,因为sizeof不会实际求运算对象的值,所以即使p是一个无效(即未初始化)的指针(参见2.3.2节,第47页)也不会有什么影响。在sizeof的运算对象中解引用一个无效指针仍然是一种安全的行为,因为指针实际上并没有被真正使用。sizeof不需要真的解引用指针也能知道它所指对象的类型。
C++11新标准允许我们使用作用域运算符来获取类成员的大小。通常情况下只有通过类的对象才能访问到类的成员,但是sizeof运算符无须我们提供一个具体的对象,因为要想知道类成员的大小无须真的获取该成员。
sizeof运算符的结果部分地依赖于其作用的类型:
1)对char或者类型为char的表达式执行sizeof运算,结果得1。
2)对引用类型执行 sizeof运算得到被引用对象所占空间的大小。
3)对指针执行 sizeof 运算得到指针本身所占空间的大小。
4)对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针不需有效。
5)对数组执行 sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和。注意,sizeof运算不会把数组转换成指针来处理。
6)对string对象或vector对象执行 sizeof 运算只返回该类型固定部分的大小不会计算对象中的元素占用了多少空间。
因为执行 sizeof运算能得到整个数组的大小,所以可以用数组的大小除以单个元素的大小得到数组中元素的个数:

// sizeof(ia)/sizeof(*ia)返回 ia的元素数量
constexpr sizetsz=sizeof(ia)/sizeof(*ia);
int arr2[sz]; //正确:sizeof返回一个常量表达式,参见2.4.4节(第58页)

因为sizeof的返回值是一个常量表达式,所以我们可以用sizeof的结果声明数组的维度。
4.10 逗号运算符
逗号运算符(comma operator)含有两个运算对象,按照从左向右的顺序依次求值。和逻辑与、逻辑或以及条件运算符一样,逗号运算符也规定了运算对象求值的顺序。
对于逗号运算符来说,首先对左侧的表达式求值,然后将求值结果丢弃掉。逗号运符真正的结果是右侧表达式的值。如果右侧运算对象是左值,那么最终的求值结果也是左值。
逗号运算符经常被用在or循环当中:

vector<int>::size_type cnt=ivec.size();
//将把从size到1的值赋给ivec的元素
for(vector<int>::size_type ix=0;
ix!= ivec.size();++ix,--cnt)
ivec[ix]=cnt;

这个循环在 for 语句的表达式中递增 ix、递减cnt,每次循环迭代 ix和cnt 相应改变。只要ix满足条件,我们就把当前元素设成cnt的当前值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值