C语言中 * 和 ++ 结合的优先级(*++i、*i++) 你还记得吗?(配具体栈内存地址 和 实际测试代码)


每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”

绪论​:
本章是一个复习篇章,关于C语言中的*++结合起来的运算符操作,主要目的也是为了让自己记忆的更加深刻(强烈建议:对于这些运算符来说能加括号就加括号,自己的代码后面自己都看不懂了o(╥﹏╥)o
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。

C语言运算符表:

对于下图的优先级和结合集表来说,太多了不太建议直接记忆:
一般来说看成:

  1. 单目运算符一般都比双目运算符高(双目比三目该高)
  2. 对于一些取数组,取对象,取成员(统一为类似取东西的)单目运算符 又比 加减乘除的(计算)运算符高
  3. 其中特别记忆前四个即可 ()[].->
  4. 对于结合律来说就不记忆了…
    在这里插入图片描述

回归正题:* 和 ++的结合起来后的优先级怎么看?


* 和 ++ 结合的优先级

因为 * 和 ++ 它们的优先级本质是一样的此时就从右往左的看谁在前面就执行谁

通过三个代码理解:

  1. 由于 * 的优先级 和 前缀递增 ++(这里相同优先级从右往左的看),所以在表达式中如果同时使用 * 和 ++,++ 会先执行。例如:

    int x = 5;
    int *p = &x;
    printf("%d\n", *++p); //注意这里本质是越界访问了!!
    

    总结:对于 *++p 来说可以看成:(*(++p)) ,注意因为是前缀++所以会直接执行(相反的后缀请看2情况)
    (下图是具体栈内存展示和测试代码)
    在这里插入图片描述

  2. 刚刚上述例子可能会出现越界,现在通过一个 后缀递增 + 一个数组的方式展示:

    int arr[] = {
          
          10, 20, 30};
    int *p = arr;
    printf("%d\n", *p++); 
    
    1. 此时访问的将还会访问到:10
    2. 这是为什么不是说从左往右吗?!
    3. 具体可以把它理解成:(*(p++))此处因为后缀++的原因,会在执行完当前其他任务后才进行++,所以即使他先进行括号++,但还是会后++。
    4. 具体如下图:
      在这里插入图片描述
  3. 那对于第一种情况(*++p),假如想:先引用再++呢

    1. 从主要理论来看:* 和 ++ 优先级一样,那么就看谁在右边
    2. 所以就能写成:++*p 这样就能先引用,然后对引用值进行++
      在这里插入图片描述
  4. 假如相对第二种情况(*p++),先引用再++呢(估计就是抽象的写成 p++* 了吧 (Doge))

直接看结论

对于* 和 ++ 的优先级,从右往左的看谁先最右边先执行谁,不过注意的是 后缀++ 仍然是最后执行(建议看看上面2)。


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量C++细致内容,早关注不迷路。

彩蛋:
在这里插入图片描述