*、p、++ 的混合表达式解析

说明


这是一个需要反复思考的问题,不论你的码龄多少,都看看

参考博客:p++、(p++)、(p)++、++p、++*p的区别

代码解释


#include 
#include 

int main()
{

    {
        int *p, a = 1;
        p = &a;
        printf("p = %p   ", p);
        printf("*p = %d   ", *p);
        printf("p = %p   ", p);
        printf("a = %d\n", a);
    }

    {
        int *p, a = 1;
        p = &a;
        printf("p = %p   ", p);
        printf("*p++ = %d   ", *p++);
        printf("p = %p   ", p);
        printf("a = %d\n", a);
    }

    {
        int *p, a = 1;
        p = &a;
        printf("p = %p   ", p);
        printf("(*p)++ = %d   ", (*p)++);
        printf("p = %p   ", p);
        printf("a = %d\n", a);
    }

    {
        int *p, a = 1;
        p = &a;
        printf("p = %p   ", p);
        printf("*(p++) = %d   ", *(p++));
        printf("p = %p   ", p);
        printf("a = %d\n", a);
    }

    {
        int *p, a = 1;
        p = &a;
        printf("p = %p   ", p);
        printf("*++p = %d   ", *++p);
        printf("p = %p   ", p);
        printf("a = %d\n", a);
    }

    {
        int *p, a = 1;
        p = &a;
        printf("p = %p   ", p);
        printf("*(++p) = %d   ", *(++p));
        printf("p = %p   ", p);
        printf("a = %d\n", a);
    }

    {
        int *p, a = 1;
        p = &a;
        printf("p = %p   ", p);
        printf("++*p = %d   ", ++*p);
        printf("p = %p   ", p);
        printf("a = %d\n", a);
    }


    {
        int *p, a = 1;
        p = &a;
        printf("p = %p   ", p);
        printf("++(*p) = %d   ", ++(*p));
        printf("p = %p   ", p);
        printf("a = %d\n", a);
    }

    return 0;
}


// 结果
p = 0022ff2c   *p = 1   p = 0022ff2c   a = 1
p = 0022ff28   *p++ = 1   p = 0022ff2c   a = 1
p = 0022ff24   (*p)++ = 1   p = 0022ff24   a = 2
p = 0022ff20   *(p++) = 1   p = 0022ff24   a = 1
p = 0022ff1c   *++p = 1   p = 0022ff20   a = 1
p = 0022ff18   *(++p) = 1   p = 0022ff1c   a = 1
p = 0022ff14   ++*p = 2   p = 0022ff14   a = 2
p = 0022ff10   ++(*p) = 2   p = 0022ff10   a = 2

结论


  • 对于前缀 ++ 而言,首先自增然后再返回一个值
  • 对于后缀 ++ 而言,首先返回值,然后再对该值自增
  • 后缀运算符++优先级高于前缀运算符 ++ 和 *
  • 后缀 ++ 结合律从左至右(先返回值后自增)
  • 前缀 ++ 和 * 优先级相同结合律从右至左
  • *p 得到的是左值

例如:

  • *p++与 *(p++)相同,后缀 ++ 优先级更高,但后缀 ++ 先返回值(指针 p),指针 p 与 * 结合之后,指针 p 再 ++,因此对应的结果是,输出指针 p 在自增前对应的值,指针 p 自增
  • (*p)++ 括号优先级最高,因此先对指针 p 取值,然后后缀 ++ 先返回值 *p,再对 *p这个整体自增,因此对应结果是输出 *p 的值,之后 *p 的值自增 1,指针 p 指向的位置不变
  • *++p 即 *(++p),最左是 *,但后面跟的是表达式 ++p 所以要先算 ++p
  • ++*p 即 ++(*p),最左是 ++ 但后面跟的是表达式 *p 所以要先算 *p

你可能感兴趣的:(编程语言,-,C++,面试汇总-,C/C++)