为什么 sizeof(x)++ 编译?

Edd*_*ddi 44 c c99

我遇到了以下代码片段:

int a = 3;
printf("%d", sizeof(a)++);
Run Code Online (Sandbox Code Playgroud)

显然,这将使用 GCC 9.3.0 和 -std=c99 进行编译。虽然这不编译:

printf("%d", sizeof(3)++);
Run Code Online (Sandbox Code Playgroud)

GCC 打印错误

错误:左值需要作为增量操作数

在我编译第一个片段之前,我会预料到会出现这样的错误。

后缀 ++ 运算符的操作数应为 C99 标准的左值

后缀递增或递减运算符的操作数应具有限定或非限定的实数或指针类型,并且应为可修改的左值。

关于 sizeof Operator 的返回值(如预期):

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则对操作数求值;否则,不计算操作数并且结果是整数常量。

结果的值是实现定义的,其类型(无符号整数类型)是 size_t,定义在(和其他头文件)中。

sizeof(a)++编译怎么可能?这是未定义的行为还是我错过了什么?

Eug*_*Sh. 44

sizeof是操作者,而不是一个功能,并作为任何操作员它有一个优先级,这是在温度比所述的下部++操作者。因此,构造sizeof(a)++等价于sizeof a++which 又等价于sizeof (a++)。这里我们有一个后增量,a它是一个左值,所以它是完全合法的。相反,如果的a3是不是左值,编译将会失败。

  • 我发誓...在访问这个答案之前我过着幸福的生活! (11认同)