您可以查看下面的代码,并注意到最后两个输出应该与我们增加了存储在 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后的含义。
后增量比取消引用具有更高的优先级,因此如果没有正确的括号放置,您会增加
dblptr
本身,使其无效并在第二次打印时取消引用它时导致 UB。
您需要用括号固定计算顺序。
(* (dblptr)) ++;
在此代码中将
(dblptr)
括在括号中是没有意义的。