指针:* p ++作为左值和右值之间的区别

时间:2018-11-02 18:13:55

标签: c pointers

所以我对指针的一件事感到困惑。让我们来看一下:

*p++

我知道运算符++比运算符*“更大”(抱歉,idk怎么说,我不是英语母语者)。因此,这意味着* p ++实际上被视为*(p ++)。因此,当* p ++用作左值和右值时,不同的结果使我感到困惑。例如:

如果我想对数组的所有元素求和,则可以正常工作(用作右值):

sum += *p++;

我的问题是,为什么它先发生* p然后出现p ++,而++则大于*。为什么它不会先发生p ++然后发生* p。

但是,如果我将其用作左值,它将按预期运行。例如:

*p++ = round(*p * 100) / 100;

首先发生p ++,然后将此新数字赋予* p。

为什么这两件事是不同的,当将其用作右值和左值时,我的意思是为什么将这个示例与求和混淆了。

谢谢:)

2 个答案:

答案 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指向的对象(不递增) )。