下面是一道考试题。+++=
看起来很奇怪,所以我问 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]);
}
考试的答案是“1 5 30 4”,我在电脑上运行代码时也是这样。
这个看起来邪恶(糟糕)的考试问题实际上是有效且定义明确的。
*pt = num;
指向第一项,确定。pt++;
指向第二项,确定。*pt++ = 5;
取消引用第二项(并在那里写入 5),然后指向第三项,OK。*pt ++= 10;
取消引用第三项(并在那里写入 10),然后指向第四项,OK。pt--;
回到第三项。*pt +++= 20;
取消引用第三项(并在那里添加 20),然后指向第四项,OK。*pt +++= 20;
具体是根据非正式地称为“最大 munch 规则”(更多信息请参见此处)的规则进行解析,这意味着 C 解析器将查找形成有效标记的最长序列,然后使用它。在这种情况下,
++
是一个比 更长的有效序列+
,因此它总是被视为像(*pt++) +=
而不是像(*pt + ) ++=
。运算符优先级:后缀
++
最高,高于一元赋值*
,高于+=
复合赋值。指针增量自然会发生在表达式的末尾,就像这里的所有其他情况一样。现在碰巧的是,结果*
是所谓的“左值”,一个可修改的内存位置,因此我们可以+=
在其之上使用。