所以我对指针的一件事感到困惑。让我们来看一下:
*p++
我知道运算符++比运算符*“更大”(抱歉,idk怎么说,我不是英语母语者)。因此,这意味着* p ++实际上被视为*(p ++)。因此,当* p ++用作左值和右值时,不同的结果使我感到困惑。例如:
如果我想对数组的所有元素求和,则可以正常工作(用作右值):
sum += *p++;
我的问题是,为什么它先发生* p然后出现p ++,而++则大于*。为什么它不会先发生p ++然后发生* p。
但是,如果我将其用作左值,它将按预期运行。例如:
*p++ = round(*p * 100) / 100;
首先发生p ++,然后将此新数字赋予* p。
为什么这两件事是不同的,当将其用作右值和左值时,我的意思是为什么将这个示例与求和混淆了。
谢谢:)
答案 0 :(得分:1)
后缀++
的优先级比一元*
高,因此*p++
被解析为*(p++)
。换句话说,您正在将*
应用于p++
的结果。
p++
的结果是p
的当前值。作为副作用,p
增加1。使用指针,这意味着p
被更新为指向序列中的下一个对象。 IOW,如果您有这种情况:
+---+---+---+---+
| | | | |
+---+---+---+---+
^
+---+
|
+---+
p: | |
+---+
然后在执行p++
(或p = p + 1
)之后,您将拥有以下内容:
+---+---+---+---+
| | | | |
+---+---+---+---+
^
|
|
+---+
p: | |
+---+
无论序列中对象的类型如何,都是如此,因此存储在p
中的地址值可能会增加1以上。
答案 1 :(得分:0)
运算符的优先级告诉我们如何结构一个表达式。括号可用于显示结构,因此sum += *p++
是sum += (*(p++))
。
在评估表达式时,我们使用每个运算符的含义,也称为其语义。
++
的含义与p++
中一样,是“分别做两件事:获取操作数的当前值并将其用作此表达式的值。并增加操作数。”因此,使用p++
,表达式的值为p
,并且分别 p
递增。增量不影响表达式的值;发生之前是p
。*
的含义是“取消引用指针。”因此,*(p++)
的结果是*p
,它是对象p
指向的对象(不递增) )。