gpt4 book ai didi

c -++*p++ 无法理解优先级的事情

转载 作者:太空宇宙 更新时间:2023-11-04 00:17:50 25 4
gpt4 key购买 nike

运行这段代码:

#include <stdio.h>

int main() {
int x[]={20,30};
int *p=x;
++*p++;
printf("%d %d\n",x[0],*p);
return 0;
}

输出是 21 30,这对我来说没有意义,因为根据 C 运算符优先级,后缀增量首先出现,但如果是这种情况,在我看来输出应该是 20 31。为了记录我我是编程新手,看来我真的无法掌握它的窍门,如果这个问题很愚蠢,我很抱歉 :)

最佳答案

来自C++标准(同样适用于C标准)

5.2 Postfix expressions 1 Postfix expressions group left-to-right.

后缀表达式和p++是后缀表达式比一元表达式有更高的优先级。

C++标准

5.3 Unary expressions 1 Expressions with unary operators group right-to-left.

在这个表达式 ++*p 中有两个一元子表达式:*p++( *p )

所以整个表达式可以这样写

++( *( p++ ) );

考虑后缀表达式++(现在是 C 标准)

6.5.2.4 Postfix increment and decrement operators

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).

让我们考虑表达式语句的结果

++( *( p++ ) );

子表达式 p++ 的操作数值为数组第一个元素的 int * 类型的地址。然后由于取消引用表达式 *( p++ ) 产生数组第一个元素的左值 x[0] 然后它的值增加。所以 arry 的第一个元素现在的值为 21。

同时后缀增量增加了指针 p 作为它的副作用(参见上面 C 标准的引用)。它现在指向数组的第二个元素。

因此输出将是

21 30

关于c -++*p++ 无法理解优先级的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44294935/

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