这里我们来看看具体的一道题:
#include <stdio.h>
int main()
{
int i;
i = 10;
printf("%d\n", i);
printf("%d\n", sizeof(i++));
printf("%d\n", i);
return 0;
}
这三行输出应该是什么?
答案是:
10
4
10
第2个无论i++它都还是int类型,跟数据是多少没有关系,所以最后结果为4(int无论在32位还是64位都是占4字节)。但是第三个为什么不是11? i为什么没有自增?
我们来好好看看C++标准中的描述:
5.3.3 sizeof
The sizeof operator yields the number of bytes in the object representation of its operand. The operand is either an expression, which is an unevaluated operand (Clause 5), or a parenthesized type-id.
也就是说,如果sizeof的操作数是一个表达式的话,这个表达式时不会被计算的。
sizeof当预处理看就行了,它后面括号里的东西,根本不求值,只根据C的一堆规则判断结果类型,然后返回结果类型的大小。另外一个操作符typeid也是如此。
【扩展】:(摘自剑指offer)
题目1:现在我们有一个类,我们在该类型中添加一个构造函数和一个析构函数,再对该类型求sizeof,得到的结果是多少?
答案1:和前面一样,还是1。调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型有关,而与类型的实例无关,编译器也不会因为这两个函数而在实例中添加任何额外的信息。
题目2:那如果把析构函数标记为虚函数呢?
答案2:C++的编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位机器上,指针占用4个字节空间,所以sizeof得到4;如果在64位机器上,则一个指针占8字节的空间,因此求sizeof得带8。