您好,
我是一所大学的助教,最近,我向我的本科生展示了我发现的C拼图中的以下C代码:
int i = 5;
int j = sizeof(i++);
printf("%d\n%d\n", i, j);
我只有一个问题:为什么i的输出等于5,而不是6? ++被忽视了吗?这里发生了什么?谢谢!
答案 0 :(得分:14)
不评估sizeof中的表达式 - 仅使用其类型。在这种情况下,类型是int,即i ++在评估时会产生的结果。这种行为是必要的,因为sizeof实际上是一个编译时操作(因此它的结果可用于调整数组大小),而不是运行时的操作。
答案 1 :(得分:3)
在编译时评估sizeof运算符。 sizeof(i ++)基本上以sizeof(int)读取编译器(丢弃++) 为了演示这一点,您可以查看您的小程序的程序集视图: 正如你在标记的行中看到的那样,整数(4)的大小已经存在并且只是加载到i中。程序运行时不会对其进行评估甚至计算。
答案 2 :(得分:1)
是的,仅在sizeof
内评估类型。
答案 3 :(得分:1)
为什么i的输出等于5,而不是6?
sizeof不评估其中的表达式,只评估类型。
我们要记住的是,sizeof不是函数,而是编译时运算符,因此,它无法评估其内容。
答案 4 :(得分:1)
主要原因是sizeof
不是function
,而是operator
。除非存在可变长度数组,否则它主要在编译时进行评估。由于int
的大小可以在编译时进行评估,因此返回4
。