为什么后增量不起作用而预增量起作用?

问题描述 投票:0回答:1

您可以查看下面的代码,并注意到最后两个输出应该与我们增加了存储在 tempptr 中的值相同,该值是使用 dblptr 对 temp 进行 addredd 的值。当我们进行预增量时它起作用,但如果我们进行后增量则不起作用。有人可以解释一下吗?

int main(){
    int temp=10;
    int * tempptr= &temp;
    int ** dblptr= &tempptr;

    cout<<tempptr<<endl;
    cout<<*(dblptr)<<endl;
    
    ++ *(dblptr);         //pre//
    // *(dblptr) ++;      //post//
    
    cout<<tempptr<<endl;
    cout<<*(dblptr)<<endl;
    
    return 0;
}

我期望最后两个输出相同。因为即使在(前或后)工作不同之后,它们最终也会做同样的事情,即 ++a 或 a++ 在执行后变成 a=a+1 。 就像前任一样。

int a=2;
int j;
j=a++;

j
变为 2,然后
a
递增。

j=++a;

j
变为 3,甚至
a
也是 3。

执行完a行值变为3后的含义。

c++ pointers double-pointer
1个回答
0
投票

后增量比取消引用具有更高的优先级,因此如果没有正确的括号放置,您会增加

dblptr
本身,使其无效并在第二次打印时取消引用它时导致 UB。

您需要用括号固定计算顺序。

(* (dblptr)) ++;

在此代码中将

(dblptr)
括在括号中是没有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.