c - 指针:*p++ 作为左值和右值的区别
问题描述
所以我对指针的一件事感到困惑。让我们看看这个:
*p++
我知道运算符 ++ 比运算符 * 更大(对不起,我不是说英语,我不是说英语的人)。所以这意味着 *p++ 实际上被理解为 *(p++)。因此,当 *p++ 用作左值和右值时,让我感到困惑的是不同的结果。例如:
如果我想对数组的所有元素求和,这将正常工作(用作右值):
sum += *p++;
我的问题是为什么它首先发生 *p 然后是 p++,当 ++ 大于 *. 为什么它不会首先发生 p++ 然后 *p。
但如果我将它用作左值,它会按我的预期工作。例如:
*p++ = round(*p * 100) / 100;
它首先发生 p++,然后这个新数字被赋予 *p。
为什么这两个东西是不同的,当它被用作右值和左值时,我的意思是我很困惑为什么这个例子与 sum。
谢谢 :)
解决方案
Postfix++
的优先级高于 unary *
,因此*p++
被解析为*(p++)
. 换句话说,您正在申请 *
的结果。p++
的结果是p++
的当前值p
。作为副作用,p
增加 1。对于指针,这意味着p
更新以指向序列中的下一个对象。IOW,如果你有这种情况:
+---+---+---+---+
| | | | |
+---+---+---+---+
^
+---+
|
+---+
p: | |
+---+
然后在执行p++
(或p = p + 1
)之后,您将拥有以下内容:
+---+---+---+---+
| | | | |
+---+---+---+---+
^
|
|
+---+
p: | |
+---+
无论序列中对象的类型如何,都是如此,因此存储的地址值p
可能会增加超过 1。
推荐阅读
- git - 如何不为 Github 上的某些文件夹拉取上游更改?
- ruby-on-rails - 在rails中打开一个模态
- html - 如何在 MVC 中设置可重用的文本字符串
- sql - 减去刚刚在 bigquery 中创建的列
- java - 使用 Java 从站点下载所有图像的最佳方法?当前收到 403 状态错误
- javascript - JavaScript:Axios Post 请求不发送 cookie(HTTP cookie)
- react-native - 是否至少在渲染一次之前引用任何可用的组件?
- php - 如何在laravel的另一个表中获取数据where子句
- typescript - 从 Typescript 文件中导出多个接口
- react-native - 杀死Android上的应用程序时Expo TaskManager崩溃?