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所求的值不是普通的
数据运算,它所求的值是这个表达式最终会变成什么类型,它只求这个。

说的很懵,先上基础图:
C语言sizeof——平常所忽略的细节
有了这个基础,再看看下面的测试结果:

下面这两张图是测试说明,sizeof后跟的表达式不会产生副作用。
C语言sizeof——平常所忽略的细节
C语言sizeof——平常所忽略的细节

这张图就用到了上面的基础类型自动转换的知识,在a+c这个表达式中,a是int,c是double,而a+c经过运算之后,最终这个a+c的类型就会自动转换成double型,而这个double就是sizeof想要的最终值,其他的工作,例如产生副作用这样的事它不干,接着看下面的图:
C语言sizeof——平常所忽略的细节

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