C语言中 ++和 *的优先级以及他们的应用实例(*p++、*++p、++*p、(*p)++)

一、在此说明 按照书上的说法++ (后置) >++(前置) >* 解引用用 > = 等于

所以说明++的优先级是高于*指针

二、实列代码演示

#include<stdio.h>

int main()
{
    //在此说明 按照书上的说法++ (后置) >++(前置) >* 解引用用 > = 等于,但是
    //c = ++*p为什么先算的 *p 后算的++ 可以看最后我给的网址
    char buf[] = "acegfd";
    char a,b,c,d;
  //  printf("a=%d--b=%d--c=%d--d=%d\n", &a, &b, &c, &d);//打印asdasf
    char* p = buf;
    printf("p的原地址 = %d\n", p);   //打印11533088--a  说明一下:指针的地址是随时改变的。

    a = *p++;                        //a=*(p++)
    printf("p-a的地址 = %d\n", p);   //打印 11533089--c
    printf("a = %c\n", a);//打印a

    b = *++p;                         //b=*(++p)
    printf("p-b的地址 = %d\n", p);    //打印11533090--e
    printf("b = %c\n", b);            //打印e

    c = ++*p;                        //c=++(*p)
    printf("p-c的地址 = %d\n", p);   //打印11533090--e
    printf("c = %c\n", c);           //打印f

    d = (*p)++;                      //d=(*p)++
    printf("p-d的地址 = %d\n", p);   //打印11533090--e
    printf("d = %c\n", d);           //打印f
   
    return 0;
}

结果展示
在这里插入图片描述
解释:

a=*(p++) a过后 p的地址+1 故p的地址为11533089 —c, 但由于p++是先运行后自加故 a = a .并没有去指向p现有的地址,而是指向了P的原有地址。

b=*(++p) b过后p的地址+1 故p的地址为11533090----e, 故b就指向p的值-e

c=++(*p) c过后 p的地址没变 故p的地址为11533090 —e, 但由于(*p)=e,++自增了1,故c=e+1=f.

d = (*p)++; d过后 p的地址没变 故p的地址为11533090
—e,因为()的优先级最高,故(*p)=e,但是由于++,所以d=f;

如果对其中还有不懂得,可以看下这个网址所讲得。链接如下
点赞、收藏

### C语言中 `*n++` 的执行顺序及其解析方式 在C语言中,表达式的解析依赖于操作符的优先级结合性。对于 `*n++` 这样的复合表达式,可以分解为以下几个部分来理解: #### 1. **操作符优先级** 根据提供的参考资料[^2],一元操作符(如解引用 `*` 自增 `++`)具有较高的优先级,而二元操作符(如加法、减法等)则优先级较低。 具体到 `*n++` 中的操作符: - 自增操作符 `++` 是右结合的一元后置操作符。 - 解引用操作符 `*` 是左结合的一元前缀操作符。 因此,在这个表达式中,`++` 的优先级高于 `*`,这意味着先计算 `n++` 部分,然后再应用解引用操作符 `*`。 #### 2. **执行顺序** 按照上述优先级规则,`*n++` 的执行过程如下: - 首先,`n++` 表示的是后置自增操作。这表示当前值会被读取并返回给后续操作,随后变量 `n` 的值才会增加 1。 - 接下来,`*` 对刚刚获取的旧值进行解引用操作,得到该指针所指向的内容。 总结来说,整个表达式的执行顺序是: 1. 获取 `n` 当前存储的地址值; 2. 返回此地址对应的内存中的内容(通过解引用实现); 3. 将 `n` 增加 1。 需要注意的是,这种行为可能引发未定义的行为如果涉及多线程或者复杂的数据结构修改情况下的竞争条件等问题[^4]。 #### 3. **代码实例说明** 下面是一个简单的例子展示如何工作: ```c #include <stdio.h> int main() { int array[] = {10, 20}; int *ptr = &array[0]; printf("Before: %d\n", *ptr); // 使用 *ptr++ printf("Value from expression (*ptr++): %d\n", *ptr++); printf("After incrementing pointer: %d\n", *ptr); return 0; } ``` 在这个程序里,当运行 `printf("Value from expression (*ptr++): %d\n", *ptr++)` 这句时, 它会打印数组的第一个元素即 `10`, 同时使 ptr 移向下一个位置也就是第二个整数的位置上。 ### 结论 综上所述,`*n++` 的实际含义取决于两个主要因素——操作符优先级以及它们各自的求值次序。由于 ++* 更高所以总是先行完成原始数值访问再做进一步动作最后才是改变本身状态的动作发生[^1].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rose_yj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值