辨析表达式++*p和*p++:自增自减++/--运算符与取值运算符*的优先级问题

学习C语言时,老师一般都会向同学们讲到++/--自增、减运算符。回过头来我们要问,为什么设计了这样的运算符?答案是——(由于很多地方如循环都会用到自增、减操作)为了简洁。

然而,某些动机不明的考题也就围绕着++和--展开了。

一些表达式辨析

  1. *p++等价于*(p++),均返回自增前的*p,再完成p的自增。
  2. (*p)++返回自增前的\*p值,然后完成p所指变量的自增。
  3. *++p 等价于 *(++p),均先完成自增,再返回自增后的p所指向的变量的值。
  4. ++*p先完成p所指变量的自增,再返回自增后的\*p值。

示例代码

#include
#include

int main()
{
    int arr[5] = { 0,2,4,6,8 };
    int* p = arr;
    /// p++
    int tmp1 = *p++;
    printf("*tmp1 value: %d;p value: %d\n", tmp1, *p);
    p = arr;
    int tmp2 = *(p++);
    printf("*tmp2 value: %d;p value: %d\n", tmp2, *p);
    p = arr;
    int tmp3 = (*p)++;
    printf("*tmp3 value: %d;p value: %d\n", tmp3, *p);
    /// ++p
    arr[0] = 0;// reset first element
    p = arr;
    int tmp4 = *++p;
    printf("*tmp4 value: %d;p value: %d\n", tmp4, *p);
    p = arr;
    int tmp5 = *(++p);
    printf("*tmp5 value: %d;p value: %d\n", tmp5, *p);
    p = arr;
    int tmp6 = ++*p;
    printf("*tmp6 value: %d;p value: %d\n", tmp6, *p);
}

输出结果如下:

*tmp1 value: 0;p value: 2
*tmp2 value: 0;p value: 2
*tmp3 value: 0;p value: 1
*tmp4 value: 2;p value: 2
*tmp5 value: 2;p value: 2
*tmp6 value: 1;p value: 1

解释与说明

++运算符可以防在变量左侧或右侧:

  • 放在左侧时(++p),首先完成变量的自增,再返回变量p的值
  • 放在右侧时(p++),首先返回变量p的值,再完成自增。

自增自减运算符++\--的优先级高于解引用运算符*的优先级,因此*p++和*(p++)是等价的。

运算符优先级参考:

辨析表达式++*p和*p++:自增自减++/--运算符与取值运算符*的优先级问题_第1张图片

运算符优先级表

你可能感兴趣的:(c/c++,数据结构,c语言)