【问题标题】:Why does sizeof(x)++ compile? [duplicate]为什么 sizeof(x)++ 会编译? [复制]
【发布时间】: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 是运算符而不是函数。而且它的优先级低于++

标签: c c99


【解决方案1】:

sizeof 是一个运算符,而不是一个函数,并且作为任何运算符,它具有优先级,在 C 中低于 ++ 运算符。因此构造sizeof(a)++ 等价于sizeof a++,而sizeof (a++) 又等价于sizeof (a++)。这里我们在a 上有后增量,这是一个左值,所以它是完全合法的。如果a 不是左值,而是3,编译将失败。

【讨论】:

  • 我发誓...在访问此答案之前,我过着更幸福的生活!
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2023-03-22
  • 2012-08-27
  • 2012-01-03
相关资源
最近更新 更多