sizeof,是在编译的时候,查找符号表,判断类型,然后根据基础类型来取值的,如果是struct则是看类型声明符号表来判定,如果字符串则是通过常
量表来判断,具体可以参考编译原理的符号表管理章节,一般都有讲,如果没讲,不要读这本书,呵呵
关于sizeof的一般性的问题,相信大家已经见过很多了。
本文讨论的是一些不常见的细节。
关于sizeof的更多细节:
1、sizeof(i++)之后,i的值会怎样?答案是不变。记得大一初学C语言时想研究一下sizeof与函数有什么区别,得到的结果只
是一些语法上的差别;学了汇编之后看看编译器生成的代码,才发现sizeof在编译时直接给定了一个常值,而非在运行时求值。进而又分析过
sizeof(表达式)的结果,清楚了类型提升原理。但我之前没有注意过表达式中出现副作用的问题,于是在sizeof(i++)的问题上犹豫了。现在经
过查阅资料和实验,结论是:sizeof在大多数情况下是编译时定值的,表达式中的任何副作用(包括有副作用的运算符、函数调用等)都不会发生。这里说
“大多数情况”,排除了针对C99的新特性——不定长数组(variable length
array)的特例。参考这篇文章(http://rednaxelafx.javaeye.com/blog/225909),如果sizeof运算符
的参数是一个不定长数组,则该需要在运行时计算数组长度。
2、sizeof('a')的结果是多少?这个要看是在C中还是C+