C 指针:*p++;作为左值和右值
所以我对指针的一点感到困惑。让我们看看这个:C 指针:*p++;作为左值和右值,c,pointers,C,Pointers,所以我对指针的一点感到困惑。让我们看看这个: *p++ 我知道operator++比operator*更大(对不起,idk怎么说,我不是以英语为母语的人)。这意味着*p++实际上被认为是*(p++)。所以让我困惑的是,当*p++被用作左值和右值时,结果是不同的。例如: *p++ = round(*p * 100) / 100; 如果我想对数组的所有元素求和,这将很好(用作右值): 我的问题是为什么它先发生在p,然后是p++,当++比*大的时候。为什么它不会先发生p++然后发生*p 但如果我把
*p++
我知道operator++比operator*更大(对不起,idk怎么说,我不是以英语为母语的人)。这意味着*p++实际上被认为是*(p++)。所以让我困惑的是,当*p++被用作左值和右值时,结果是不同的。例如:
*p++ = round(*p * 100) / 100;
如果我想对数组的所有元素求和,这将很好(用作右值):
我的问题是为什么它先发生在p,然后是p++,当++比*大的时候。为什么它不会先发生p++然后发生*p
但如果我把它用作左值,它就会像我期望的那样工作。例如:
*p++ = round(*p * 100) / 100;
它首先发生在p++上,然后这个新数字被赋予*p
为什么这两个东西是不同的,当它被用作右值和左值时,我的意思是我不明白为什么这个例子中有sum
谢谢:)运算符的优先级告诉我们如何构造表达式。括号可以用来表示结构,因此
sum+=*p++
是sum+=(*(p++)
在计算表达式时,我们使用每个运算符的含义,也称为其语义
- 后缀
的含义与++
一样,是“分别做两件事:获取操作数的当前值并将其用作此表达式的值。然后递增操作数。”因此,使用p++
,表达式的值是p++
,和分别p
递增。增量不影响表达式的值;在增量发生之前是p
p
- 一元
的意思是“取消引用指针”。因此*
的结果是*(p++)
,这是*p
指向的对象(没有增量)p
后缀
++
的优先级高于一元*
,因此*p++
被解析为*(p++)
。换句话说,您正在对p++
的结果应用*
p++
的结果是p
的当前值。作为副作用,p
增加1。对于指针,这意味着更新p
以指向序列中的下一个对象。如果你遇到这种情况:
+---+---+---+---+
| | | | |
+---+---+---+---+
^
+---+
|
+---+
p: | |
+---+
然后在执行p++
(或p=p+1
)之后,您将得到以下结果:
+---+---+---+---+
| | | | |
+---+---+---+---+
^
|
|
+---+
p: | |
+---+
无论序列中对象的类型如何,这都是正确的,因此存储在
p
中的地址值可能会增加1以上 当这真的是一个前缀/后缀增量问题时,你可能会把它混淆为一个计算顺序问题。你能解释一下吗?我问的问题是为什么它先发生*p,然后是p++,当++比*大的时候就不发生了。增量具有更高的优先级,将首先求值,但它会产生旧值,因为这是后缀增量。通过“更大”,您的意思是“具有优先级”(位于前面),如中所示。