*和++的优先级问题

在c语言中*++是同优先级的,需要按从右到左的顺序执行。
下面进行一些测试

#include <iostream>
using namespace std;

int main() {
    int pval[5] = {11, 22, 33, 44, 55};
    int* p;
    cout << "*pval = " << *pval << ", pval = " << pval << endl;

    p = pval;
    cout << "*p = " << *p << ", p = " << p << endl;

    // 右自增: *p++  *(p++)  (*p)++
    p = pval;
    cout << "*p++ = " << *p++ << ", *p = " << *p << ", p = " << p << endl;

    p = pval;
    cout << "*(p++) = " << *(p++) << ", *p = " << *p << ", p = " << p << endl;

    p = pval;
    cout << "(*p)++ = " << (*p)++ << ", *p = " << *p << ", p = " << p << endl;

    // 左自增:++*p 和 ++(*p)
    pval[0] = 11;
    p = pval;
    cout << "++*p = " << ++*p << ", *p = " << *p << ", p = " << p << endl;

    pval[0] = 11;
    p = pval;
    cout << "++(*p) = " << ++(*p) << ", *p = " << *p << ", p = " << p << endl;
    return 0;
}

运算结果如下:

/*
        *pval = 11, pval = 0x61fe00
        *p = 11, p = 0x61fe00
        *p++ = 11, *p = 22, p = 0x61fe04
        *(p++) = 11, *p = 22, p = 0x61fe04
        (*p)++ = 11, *p = 12, p = 0x61fe00
        ++*p = 12, *p = 12, p = 0x61fe00
        ++(*p) = 12, *p = 12, p = 0x61fe00

        分析:
            * 和 ++的运算优先级是相同的,故是从左到右计算的
            *p++    : 等同于:*(p++); *p; p = p + 1; 从结果来看,是先p++,再用p++的返回值(即p)进行解引用,等同于*(p++)
                        
            *(p++)  : 等同于:*p; p = p + 1; 先p++,在解引用,由于p++返回的还是p的地址,故解引用还是取第一个地址的元素,但运算完之后此时p已经+1了
                        
            (*p)++  : 等同于:*p = *p + 1; 先取*p,在对*p做++, 等同于(*p)++, 即等于p[0]++;
                        
            ++*p    : 等同于++(*p)

            ++(*p)  : 等同于:++(p[0]); 先取*p,然后对其取出的结果进行前置的++,

        总结:
            *p++ 和 *(p++)  等价,两个表达式的值都等价于*p的值,执行表达式之后,指针p的值增加一个地址单元长度,指向数组下一个位置;
            (*p)++  的值等价于*p的值,执行表达之后,指针p的值不变,p所指向的地址单元的值+1; 
            ++*p 和 ++(*p) 等价,两个表达式的值都等于 *p 的值 +1(左++先自增后参与运算),指针p的值不变,p所指向的地址单元的值+1.
    */      

总结:

  • *p++ :*和++都是同级运算符,右结合。但++要整个表达式运算完了才运算,先提取p指向对象的值,然后p再做++运算,指向下一个对象。

  • *(p++) : ++要整个表达式运算完了才自加,所以同上,提取的还是P指向的对象值,提取后,P就指向下一个对象了。

  • (*p)++ : 先取值,然后值右++;

  • ++*p : 是先取值,然后值++;

  • ++(*p) : 等同于++*p,先取值,然后值左++;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值