首页 > C++编程 > 再谈面试中的sizeof

再谈面试中的sizeof

上面两篇文章谈到了sizeof对C++空类的相关知识点,让我想起了以前做过的一道题目,也是考sizeof的。题目如下:

//Provided by 代码疯子
//Blog: http://www.programlife.net/
#include <stdio.h>
 
int main()
{
	int i = 0;
	printf("%d %d\n", i++, sizeof(i++));
	printf("%d\n", i);
 
	return 0;
}

求结果并解释。输出结果是“0 4 1”(不考虑换行了。呵呵。我把答案设置成白色,用鼠标选中就可以看到了)。

为什么会这样了?解释说是编译的时候优化了一下,直接把sizeof(i++)用4代替了。于是相当于printf("%d %d\n", i++, 4);输出就是0 4了。很多同学可能会想到printf的计算顺序问题,那样就上当了。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 再谈面试中的sizeof
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: C++编程 标签: , ,
  1. 2011年1月11日11:00 | #1

    表示我也想到printf的顺序的说。。。

    不过不知道是不是所有编译器都这么处理?

    [回复]

  2. 2011年1月13日10:24 | #2

    @Tanky Woo
    我想大部分编译器都要优化吧。

    [回复]

  3. ligand
    2012年12月30日13:39 | #3

    sizeof()里面是一个type expression,也就是说sizeof算符只关心它的实参是什么类型。例如 sizeof(101);int j; sizeof(j);看看它们的反汇编,都是非常简单地用4来代替。换句话,sizeof(i++);或者sizeof( fooFunc(aug1,aug2) );都是并没有对sizeof括号里面的表达式求值(可以写个小程序验证,fooFunc这个函数根本就没被调用),只是由编译时静态判明了其类型,就直接用其类型的长度代替了sizeof返回值。

    [回复]

    berry 回复:

    @ligand, sizeof怎么变成函数了呢?

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.