gcc对什么是左值感到困惑?

R..*_*R.. 2 c standards gcc lvalue

gcc在赋值错误中给出了无效的左值:

-2[(size_t *)new] = 0;
Run Code Online (Sandbox Code Playgroud)

将代码更改为以下内容使其消失:

((size_t *)new)[-2] = 0;
Run Code Online (Sandbox Code Playgroud)

但据我所知,两者在C中都是100%等效的.在非左值表达式中使用前者没有问题.这只是gcc中的一个错误吗?我用几个版本测试了它并得到了相同的结果.

R..*_*R.. 7

我真笨.[]-这更紧密地绑定,所以这个表达式实际上是读取索引2并且否定它.

  • 嗯?我没有删除这个问题,因为(1)我认为我应该羞于搞砸了这个问题,并且(2)答案可能很有意思,并且为什么我使用的构造可能不应该被使用(在少数几个中)在我使用它的情况下,目的是降低括号的级别,因为我有读取含有太多括号的表达式的视觉/感知问题). (3认同)
  • 你是愚蠢的,"一个非常狭窄的情况,通常不适用于全球互联网用户"? (2认同)