C 使用++;在sizeof关键字中

C 使用++;在sizeof关键字中,c,puzzle,sizeof,C,Puzzle,Sizeof,可能重复: 嗨 我是一所大学的助教,最近,我向我的本科生展示了我发现的一个C拼图中的以下C代码: int i = 5; int j = sizeof(i++); printf("%d\n%d\n", i, j); 我只有一个问题:为什么I的输出等于5,而不是6?是否简单地忽略了++?这是怎么回事?谢谢 不计算sizeof中的表达式-只使用其类型。在本例中,类型为int,如果对其求值,i++将产生的结果。这种行为是必要的,因为sizeof实际上是一个编译时操作(因此其结果可以用于调整数组大小)

可能重复:

我是一所大学的助教,最近,我向我的本科生展示了我发现的一个C拼图中的以下C代码:

int i = 5;
int j = sizeof(i++);
printf("%d\n%d\n", i, j);

我只有一个问题:为什么I的输出等于5,而不是6?是否简单地忽略了++?这是怎么回事?谢谢

不计算sizeof中的表达式-只使用其类型。在本例中,类型为int,如果对其求值,i++将产生的结果。这种行为是必要的,因为sizeof实际上是一个编译时操作(因此其结果可以用于调整数组大小),而不是运行时操作。

是的,inside
sizeof
仅针对该类型进行计算

为什么i的输出等于5,而不是6

sizeof不计算其中的表达式,只计算类型


我们要记住的是,sizeof不是一个函数,而是一个编译时操作符,因此,它不可能评估它的内容。

主要原因是,
sizeof
不是一个
函数,它是一个
操作符。除非存在可变长度数组,否则它大部分在编译时进行计算。由于
int
的大小可以在编译时计算,因此它返回
4

在编译时计算sizeof运算符。sizeof(i++)基本上以sizeof(int)的形式读取编译器(丢弃++)。
要演示这一点,您可以查看小程序的汇编视图:
正如您在标记行中看到的,整数(4)的大小已经存在,并且刚刚加载到i中。当程序运行时,它不被评估或计算。

如果操作数是VLA,则不总是在编译时进行评估。请考虑<代码> SIZEOF(INT[I++])。