在两个增量和间接运算符的情况下,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
是一个指针,我会说会发生这种情况:
t
地址将递增,因此它将指向 tab
数组(索引 1)中的第二个元素。
- 现在,应该处理间接运算符,因此
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).
昨天,我偶然发现了大学讲师的示例代码(我给他的一个学生上私人课程)。我试图了解此代码为何以及如何工作,但我仍然不确定,即使经过几个小时的研究。这是我拥有的:
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
是一个指针,我会说会发生这种情况:
t
地址将递增,因此它将指向tab
数组(索引 1)中的第二个元素。- 现在,应该处理间接运算符,因此
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).