在两个增量和间接运算符的情况下,C 如何处理运算优先级?

How does C handle operation precedence in case of two increments and indirection operator?

昨天,我偶然发现了大学讲师的示例代码(我给他的一个学生上私人课程)。我试图了解此代码为何以及如何工作,但我仍然不确定,即使经过几个小时的研究。这是我拥有的:

int tab[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int* t = tab;
int i;
for (i = 0; i < 10; i++)
{
    (*t++)++;
    printf("%d ", tab[i]);
};

结果是:

1 2 3 4 5 6 7 8 9 10

所以,这段代码很容易理解,除了这部分:

(*t++)++

我知道递增运算符优先于间接运算符,所以这个操作最有可能被处理为:

(*(t++))++

考虑到 t 是一个指针,我会说会发生这种情况:

  1. t 地址将递增,因此它将指向 tab 数组(索引 1)中的第二个元素。
  2. 现在,应该处理间接运算符,因此 tab 数组中第二个元素的值将递增,因为我们最终得到 (*t)++.

现在,我的问题是,为什么所有 tab 元素都递增?考虑到指针递增发生在循环开始时,它不应该跳过第一个 tab 元素(索引 0)吗?

运算符优先级表示 *t++ 必须分解为 *(t++)。 因此表达式就像 (*t)++; t++;

不明白t++是什么意思的时候可能会混淆,这个表达式的值是自增前t的值,t可以观察为在计算(整个)表达式后递增。

你可以想象这个表达式的计算结果

(*t++)++;

作为以下语句的序列

int *tmp = t;
( *t )++;
++tmp;
t = tmp;

来自 C 标准(6.5.2.4 Post修复递增和递减运算符)

2 The result of the postfix ++ operator is the value of the operand. As a side effect, the value of the operand object is incremented (that is, the value 1 of the appropriate type is added to it).