#include <iostream>
using namespace std;
int main () {
int value = 1, *pointer;
pointer = &value;
cout << *pointer++ << endl;
cout << *pointer << endl;
}
为什么++
运算符不会增加value
?
答案 0 :(得分:10)
Post-increment (++
) has higher precedence than dereference (*
).这意味着++
绑定到pointer
而不是*pointer
。
请参阅C FAQ 4.3及其中的参考资料。
答案 1 :(得分:7)
好的,每个人都解释了参数的绑定 但是没有人提到它意味着什么。
int data[1,2,3,4,5];
int* pointer = data;
std::cout << *pointer++ << std::endl;
std::cout << *pointer << std::endl;
如上所述,++运算符具有更高的优先级,因此比*运算符更紧密。所以表达式也是等价的:
std::cout << *(pointer++) << std::endl;
std::cout << *pointer << std::endl;
但是operator ++是后缀版本。这意味着指针递增但操作结果返回原始值以供*运算符使用。因此,我们可以修改语句如下;
std::cout << *pointer << std::endl;
pointer++;
std::cout << *pointer << std::endl;
因此输出的结果是当前指向的整数,但指针也会递增。所以打印的值是
1
2
不
2
3
答案 2 :(得分:3)
++
的优先级高于*
,因此您的表达式等同于*(pointer++)
- 它取消引用该值,然后递增指针,而不是值。如果要增加值,则需要执行(*pointer)++
。
答案 3 :(得分:2)
与做
是一回事*(pointer++)
因为它增加了指针所占的地址,然后它取消引用它。
答案 4 :(得分:1)
*pointer++
表示*(pointer++)
。
即,它会增加指针,而不是指针。
记住这一点的一种方法是阅读原始的K&amp; R“The C Programming Language”,其中strcpy
的例子使用它。
无论如何,这就是我记住优先权的方式。
并且由于它递增指针,因此您的第二个取消引用具有未定义的行为。
欢呼&amp;第h。,答案 5 :(得分:0)
您正在递增指针的值,而不是指向它的值。