【发布时间】:2020-08-23 02:30:24
【问题描述】:
我遇到了以下代码sn-p:
int a = 3;
printf("%d", sizeof(a)++);
显然这将使用 GCC 9.3.0 和 -std=c99 进行编译。 虽然这不会编译:
printf("%d", sizeof(3)++);
GCC 打印错误
错误:需要左值作为增量操作数
在我编译第一个 sn-p 之前,我预计会出现这样的错误。
后缀 ++ 运算符的操作数应为 C99 标准的左值
后缀递增或递减运算符的操作数应具有合格或不合格的实数或指针类型,并且应是可修改的左值。
关于sizeof运算符的返回值(如预期):
sizeof 运算符产生其操作数的大小(以字节为单位),可能是 表达式或类型的括号名称。大小由类型决定 操作数。结果是一个整数。如果操作数的类型是变长数组 类型,计算操作数;否则,不计算操作数,结果为 整数常量。
结果的值是实现定义的,其类型(无符号整数类型) 是 size_t,在(和其他标头)中定义。
sizeof(a)++ 怎么可能编译?这是未定义的行为还是我遗漏了什么?
【问题讨论】:
-
也许括号让你感到困惑。你也可以这样写:
sizeof a++. -
同
sizeof (a++)。sizeof是运算符而不是函数。而且它的优先级低于++