C语言sizeof——平常所忽略的细节

本文章不从头说起sizeof,只讨论sizeof的一些细节问题。

今天做了一道面试题,是关于sizeof的,题如下:

int a = 3;

int b;

b = sizeof(++a + ++a);

printf(“%d, %d”, a, b);

(对于64或32位机)答案:

3, 4

为什么?为啥a是3?它不是自加了两次吗?

本人做完题之后马上上网查阅有关sizeof的相关技术文档,让我想起了sizeof的一些细节:

sizeof对它的操作数,也就是操作对象,它是不给予运算的,也就是不会产生副作用。

副作用:b = a+3; 这条表达式的副作用就是b的值被修改为该表达式的值,该表达式的值是a+3,这就是副作用。

也就是说,不管你sizeof后跟的表达式对产生怎样的副作用,sizeof它只求该表达式的值,sizeof所求的值不是普通的
数据运算,它所求的值是这个表达式最终会变成什么类型,它只求这个。

说的很懵,先上基础图:
在这里插入图片描述
有了这个基础,再看看下面的测试结果:

下面这两张图是测试说明,sizeof后跟的表达式不会产生副作用。
在这里插入图片描述
在这里插入图片描述

这张图就用到了上面的基础类型自动转换的知识,在a+c这个表达式中,a是int,c是double,而a+c经过运算之后,最终这个a+c的类型就会自动转换成double型,而这个double就是sizeof想要的最终值,其他的工作,例如产生副作用这样的事它不干,接着看下面的图:
在这里插入图片描述

下面两张测试图可以很明显的看出,sizeof根本不会让a=a+c这个表达式产生副作用,使a等于a+c的值。
它只关心这条a=a+c表达式运算完后,最终的类型结果是什么,这才是它想要的。
在这里插入图片描述
在这里插入图片描述
总结:sizeof后跟表达式时,它只关心该表达式运算完后 (相应的类型自动转换完后) 是什么类型,然后对该最终类型进行计算字节大小并返回size_t(无符号整形)类型的值给变量b,不对表达式产生副作用。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值