Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针:*p++;作为左值和右值_C_Pointers - Fatal编程技术网

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++,当++比*大的时候就不发生了。增量具有更高的优先级,将首先求值,但它会产生旧值,因为这是后缀增量。通过“更大”,您的意思是“具有优先级”(位于前面),如中所示。