每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”
绪论:
本章是一个复习篇章,关于C语言中的*
和++
结合起来的运算符操作,主要目的也是为了让自己记忆的更加深刻(强烈建议:对于这些运算符来说能加括号就加括号,自己的代码后面自己都看不懂了o(╥﹏╥)o)
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。
C语言运算符表:
对于下图的优先级和结合集表来说,太多了不太建议直接记忆:
一般来说看成:
- 单目运算符一般都比双目运算符高(双目比三目该高)
- 对于一些取数组,取对象,取成员(统一为类似取东西的)单目运算符 又比 加减乘除的(计算)运算符高
- 其中特别记忆前四个即可
()
、[]
、.
、->
- 对于结合律来说就不记忆了…
回归正题:* 和 ++的结合起来后的优先级怎么看?
* 和 ++ 结合的优先级
因为 * 和 ++ 它们的优先级本质是一样的此时就从右往左的看谁在前面就执行谁
通过三个代码理解:
-
由于
*
的优先级 和 前缀递增++
(这里相同优先级从右往左的看),所以在表达式中如果同时使用 * 和 ++,++ 会先执行。例如:int x = 5; int *p = &x; printf("%d\n", *++p); //注意这里本质是越界访问了!!
总结:对于 *++p 来说可以看成:
(*(++p))
,注意因为是前缀++所以会直接执行(相反的后缀请看2情况)
(下图是具体栈内存展示和测试代码)
-
刚刚上述例子可能会出现越界,现在通过一个 后缀递增 + 一个数组的方式展示:
int arr[] = { 10, 20, 30}; int *p = arr; printf("%d\n", *p++);
- 此时访问的将还会访问到:10
- 这是为什么不是说从左往右吗?!
- 具体可以把它理解成:
(*(p++))
此处因为后缀++的原因,会在执行完当前其他任务后才进行++,所以即使他先进行括号++,但还是会后++。 - 具体如下图:
-
那对于第一种情况(*++p),假如想:先引用再++呢
- 从主要理论来看:* 和 ++ 优先级一样,那么就看谁在右边
- 所以就能写成:++*p 这样就能先引用,然后对引用值进行++
-
假如相对第二种情况(*p++),先引用再++呢(估计就是抽象的写成
p++*
了吧 (Doge))
直接看结论
对于* 和 ++ 的优先级,从右往左的看谁先最右边先执行谁,不过注意的是 后缀++ 仍然是最后执行(建议看看上面2)。
本章完。预知后事如何,暂听下回分解。
如果有任何问题欢迎讨论哈!
如果觉得这篇文章对你有所帮助的话点点赞吧!
持续更新大量C++细致内容,早关注不迷路。
彩蛋: