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,不对表达式产生副作用。