sizeof(i++)是多少?

  这里我们来看看具体的一道题:

  #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。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值