C 中 *p++ 和 *p += 1 有什么区别?

问题描述 投票:0回答:1

我刚刚开始学习 C 中的指针,并使用指针

p
来迭代数组的元素。
我的目标是将每个元素增加 1,但在应用增量运算符后,我注意到一个相当混乱的输出。它不会显示
value + 1
,而只会显示数组中的奇数。

这是代码:

#include <stdio.h>

#define N 10

int main(void)
{
    int a[N] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p;
    for (p = &a[0]; p < &a[N]; p++)
    {   
        *p++;
        printf("%d ", *p);
    }
    
    return 0;
}

输出:

1 3 5 7 9

然后我将

++
替换为
+= 1
,输出正如我最初预期的那样:

1 2 3 4 5 6 7 8 9 10

我真的不明白这里发生了什么,直到现在我认为这两种符号对于每个用例都是等效的。

c pointers operator-precedence
1个回答
8
投票

C99 中 *p++ 和 *p += 1 有什么区别?

这是一个运算符优先级的问题:

  1. *p++
    :
    ++
    比解除引用具有更高的优先级
    *
    ,
    所以它相当于:
    *(p++)

    IE。指针递增,然后取消引用。

  2. *p += 1
    :
    解除引用
    *
    的优先级高于
    +=
    ,
    所以它相当于:
    (*p) += 1

    IE。指针被取消引用,然后结果递增。

如果你想得到(2)(

*p += 1
)的结果而不使用
+=
,你可以通过使用括号来实现,即:
(*p)++

或者,您可以使用甚至不需要括号的预增量:
++*p

© www.soinside.com 2019 - 2024. All rights reserved.