gpt4 book ai didi

C 运算符优先级 - 数组下标和前缀增量

转载 作者:行者123 更新时间:2023-12-05 01:32:33 26 4
gpt4 key购买 nike

C 中的数组下标 [] 被列为比前缀增量具有更高的优先级。

具有以下简单程序:

#include <stdio.h>
int main()
{
char testArr[] = "asdfgh";
int a = 0;
printf("element is %c\n",testArr[++a]);
}

为什么打印的是 s 而不是 a?
在我看来,应该先应用 []。
这意味着应该显示 testArr 的第一个元素 0 而不是元素 1。

最佳答案

下标运算符定义如下

postfix-expression [ expression ]

因此,要应用下标运算符,编译器应计算方括号中的表达式(连同后缀表达式)以获取表达式的值。

来自 C 标准(6.5.2.1 数组下标)

2 A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).



为了更清楚地考虑一个简单的代码片段
int i = 0;
int j = 1;

printf("element is %c\n",testArr[i + j]);

编译器如何在不计算表达式的情况下确定索引 i + j ?

即下标运算符由两个子表达式组成,这些子表达式被评估以获取它们的值。

如果考虑以下表达式,您的问题是合理的
++testArr[++a]

甚至下面的表达式
++a[testArr]

在这种情况下,由于运算符优先级,第一个表达式等效于
++( testArr[++a] )

第二个相当于
++( a[testArr] )

所以下标运算符将其子表达式包含在方括号中 ++atestArr先求值,然后一元运算符求值。

另一方面,如果使用后缀增量,如
a++[testArr]

那么表达式等价于
( a++[testArr] )

也就是说它只是遵循其自己的定义形式的下标运算符
        a++        [  testArr   ]    
postfix-expression [ expression ]

关于C 运算符优先级 - 数组下标和前缀增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45970363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com