📜  为什么sizeof(x ++)不能在C中递增x?

📅  最后修改于: 2021-05-25 20:00:41             🧑  作者: Mango

根据C99标准,sizeof()运算符仅考虑操作数的类型,它可以是表达式或类型的名称(即,int,double,float等),而不是在评估表达式时获得的值。因此,不评估sizeof()运算符内的操作数。仅当操作数的类型为可变长度数组时才进行评估,因为在这种情况下,只有在对表达式求值之后才能确定大小。

情况1:

当传递sizeof()方法时,将使用固定大小的结构:

在这种情况下,sizeof()运算符不会评估该参数。仅检查参数的类型,并返回其大小。

下图显示了这种情况下sizeof()运算符的工作流程:

范例1:

与预期值4相比,增量后x的输出值仍为3。这是因为sizeof运算符不需要评估表达式即可获得大小,因为操作数的数据类型不变,因此大小保持不变。

#include 
  
int main()
{
    int x = 3;
    printf("%d\n", sizeof(x++));
    printf("x = %d", x);
  
    return 0;
}

输出:

4
x = 3

情况2:

当传递sizeof()方法时,将使用可变大小的结构:

在这种情况下,sizeof()运算符评估该参数以查看大小是否发生任何变化。如果找到,则首先修改大小,然后返回最终大小。

下面的示例说明了这种情况下的sizeof()运算符:

范例2:

在此示例中,sizeof运算符需要评估表达式以便计算图中所示的数组的大小。因此,在这种情况下,我们得到增量后的x值。

#include 
  
int main()
{
    int x = 3;
    printf("%d\n", sizeof(int[x++]));
    printf("x = %d", x);
  
    return 0;
}

输出:

12
x = 4

范例3:

同样在此示例中,sizeof运算符需要评估表达式以便计算图中所示的数组的大小。在此示例中,使用了后递增运算符,因此第一行的输出为16。在第二行中,x的值在递增后打印。

#include 
  
int main()
{
    int x = 3;
    printf("%d\n", sizeof(int[++x]));
    printf("x = %d", x);
  
    return 0;
}

输出:

16
x = 4
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。