C++;操作员++;和指针 我在C++中做了第一步,在java中有很好的背景。我需要清除C++中的++操作符的一些特殊性。考虑下面的程序: #include <iostream> using namespace std; void __print(int x, int *px) { cout << "(x, *px) = (" << x << ", " << *px << ")" << endl; } int main() { int x = 99; int *px = &x; __print(x, px); x++; __print(x, px); x = x + 1; __print(x, px); *px = *px + 1; __print(x, px); *px++; __print(x, px); return 0; }

C++;操作员++;和指针 我在C++中做了第一步,在java中有很好的背景。我需要清除C++中的++操作符的一些特殊性。考虑下面的程序: #include <iostream> using namespace std; void __print(int x, int *px) { cout << "(x, *px) = (" << x << ", " << *px << ")" << endl; } int main() { int x = 99; int *px = &x; __print(x, px); x++; __print(x, px); x = x + 1; __print(x, px); *px = *px + 1; __print(x, px); *px++; __print(x, px); return 0; },c++,pointers,C++,Pointers,似乎*px=*px+1对*px的影响与对x的影响不同。但是这些东西不都一样吗???它不是*px==x吗?操作符在+之后工作,因此它返回错误地址的值。在C++中,操作符优先级是很重要的。看看这个: 添加括号以更改运算符优先级,例如: #include <iostream> using namespace std; void __print(int x, int *px) { cout << "(x, *px) = (" << x <

似乎*px=*px+1对*px的影响与对x的影响不同。但是这些东西不都一样吗???它不是*px==x吗?

操作符在
+
之后工作,因此它返回错误地址的值。在C++中,操作符优先级是很重要的。看看这个:

添加括号以更改运算符优先级,例如:

#include <iostream>
using namespace std;
void __print(int x, int *px) {
 cout << "(x, *px) = (" << x << ", " << *px << ")" << endl;
}

int main() {
 int x = 99;
 int *px = &x;
 __print(x, px);
 x++; __print(x, px);
 x = x + 1; __print(x, px);
 *px = *px + 1; __print(x, px);
 (*px)++; __print(x, px);
 return 0;
}

问题在于运算符优先级。试试
(*px)+

当您执行
*px++
时,实际上是在地址中添加1,然后获得值。您很可能是指
(*px)+

*px+1获取px指向的值,并将其加1


*px++首先递增地址,然后取px指向的值。这是一个优先级问题:

*px=*px+1
读作
(*px)=(*px)+1
,由于px=&x,它类似于
x=x+1


*px++
读作
*(px++)
,因此您实际上是在向前移动指针,并获取内存作为x变量的下一个位置的值(很可能是垃圾)。

的优先级高于*。因此,计算(px++)。现在*(px++)是一个浪费声明。您既没有指定也没有从该位置读取值。此外,(px++)还有一个可能尚未初始化的位置地址。所以你得到了垃圾值。

< P>哇,这么多人不知道C++操作员是如何工作的。p> 每个人都正确地指出,这是一个优先顺序的问题,然而,问题到底是什么,似乎每个人都不知道

*p++;作为一个陈述,它只做了一件事。它使指针递增。在对其求值并取消对其原始值的引用后(在本例中,该值将被忽略)


在上面的例子中,c将等于10,b将指向a(20)的第二个元素。因为指针
b
将在增量之前求值。

“似乎*px=*px+1对*px的影响与对x的影响不同。”你为什么这么说?我想您一定看错了输出的行。仅供参考:匹配
^\uuuw*
^[A-Z]\w*
的标识符保留给任何范围内的实现,而匹配
^[A-Z]\w*
的标识符保留给全局范围内的实现。TL;医生:不要使用
\u print
@MatthieuM。第一个应该是简单的
\uu
。在任何地方都保留带有双下划线的标识符,而不仅仅是开头。@R.MartinhoFernandes:对!哦……不,指针的原始值在增量发生之前被取消引用。
#include <iostream>
using namespace std;
void __print(int x, int *px) {
 cout << "(x, *px) = (" << x << ", " << *px << ")" << endl;
}

int main() {
 int x = 99;
 int *px = &x;
 __print(x, px);
 x++; __print(x, px);
 x = x + 1; __print(x, px);
 *px = *px + 1; __print(x, px);
 (*px)++; __print(x, px);
 return 0;
}
(x, *px) = (99, 99)
(x, *px) = (100, 100)
(x, *px) = (101, 101)
(x, *px) = (102, 102)
(x, *px) = (103, 103)
int  a[ 2 ] = { 10, 20 };
int* b = &a[ 0 ];
int  c = *b++;