指针运算拾遗

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29567701/article/details/82721745

指针运算拾遗

如有错误,欢迎指正。
如若转载,请声明原创:https://blog.csdn.net/qq_29567701/article/details/82721745

一、*p + *p++ + *++p;
题目:

    int a[] = { 1, 2, 3, 4, 5 };
    int *p = a;
    int result = *p + *p++ + *++p;
    cout << result << endl;

结果:6
分析如下:
1、 C++运算符优先级:
优先级 Top2: -(负号运算符)、++(前置++或后置++)、–(前置–或后置–)、*(指针取值运算符)、&(取地址运算符) 一个级别,遇到后,从左向右运算
注意其中,++和–,比 * 优先级高
优先级 Top3: /、*(乘)、%
优先级 Top4: +、-(减法运算符)
优先级 Top8: &(按位与)、|、^
2、*p + *p++ + *++p;

(1) 先做优先级高的运算:  ++
    从左向右:
    p++ ,只有此轮循环结束之后,p才指向下一个,故还指向当前值 1
    ++p ,指针p先指向下一位在做运算 p指向2;

    此时,表达式相当于:优先级如下:1,2,3...优先级递减
    (*p) + (*(p++)) + (*(++p));
              1          1   
     2      2          2
         3           3
    注意此时,*p + *p++ + *++p; 表达式中所有的 指针p 都指向了2

(2) 再做Top2中的次优先级:*(指针取值运算符)
    *p =2
    *p++ =2
    *++p =2

    故最终的结果为2+2+2=6;

二、++*p++;
题目:

    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    int*p = a + 4;
    int b = 4 + ++*p++;
    cout << b << endl;

结果:10
分析如下:

4 + ++*p++; 相当于 4 + ( ++*p++ );
    分析 ++*p++
    前置++和后置++是同一个优先级,故从左向右运算
    *(取值算符)虽然也是 Top2的优先级,但是却比++运算符优先级低
(1)故先运算++p++
    之前,int*p = a + 4; //p初始指向了5
    (1.1)++p之后,p指向了6
    (1.2)后置运算符++,在此行运算结束之后,才起作用,程序运行到下一行之后,p才会指向 7
(2)再运算 *(指针取值运算符),取出 6
    故此时 ++*p++; 结果为 6
     4 + ++*p++; 结果为 4+6=10;

猜你喜欢

转载自blog.csdn.net/qq_29567701/article/details/82721745