*pt +++= 20 有效吗?

Dam*_*les 0 c

下面是一道考试题。+++=看起来很奇怪,所以我问 MS Copilot,它一直说它无效,而 Google Gemini 说它可能有效,但未定义。有效*pt +++= 20;并保证与*pt++ += 20;

#include <stdio.h>
void main()
{
    int num[4] = {1, 2, 3, 4};
    int *pt = num;
    pt++;
    *pt++ = 5;
    *pt ++= 10;
    pt--;
    *pt +++= 20;
    printf("%d %d %d %d", num[0], num[1], num[2], num[3]);
}
Run Code Online (Sandbox Code Playgroud)

考试的答案是“1 5 30 4”,我在电脑上运行代码时也是这样。

Lun*_*din 7

这个看起来邪恶(糟糕)的考试问题实际上是有效且定义明确的。

  • *pt = num;指向第一项,确定。
  • pt++;指向第二项,确定。
  • *pt++ = 5;取消引用第二项(并在那里写入 5),然后指向第三项,OK。
  • *pt ++= 10;取消引用第三项(并在那里写入 10),然后指向第四项,OK。
  • pt--;回到第三项。
  • *pt +++= 20;取消引用第三项(并在那里添加 20),然后指向第四项,OK。

*pt +++= 20;具体是根据非正式地称为“最大 munch 规则”(更多信息请参见此处)的规则进行解析,这意味着 C 解析器将查找形成有效标记的最长序列,然后使用它。

在这种情况下,++是一个比 更长的有效序列+,因此它总是被视为像(*pt++) +=而不是像(*pt + ) ++=

运算符优先级:后缀++最高,高于一元赋值*,高于+=复合赋值。指针增量自然会发生在表达式的末尾,就像这里的所有其他情况一样。现在碰巧的是,结果*是所谓的“左值”,一个可修改的内存位置,因此我们可以+=在其之上使用。