【问题标题】:In C++, how does the expression, "*pointer++" work?在 C++ 中,表达式“*pointer++”如何工作?
【发布时间】:2010-12-12 20:00:44
【问题描述】:
#include <iostream>
using namespace std;

int main () {
    int value = 1, *pointer;
    pointer = &value;
    cout << *pointer++ << endl;
    cout << *pointer << endl;
}

为什么++ 运算符不增加value

【问题讨论】:

  • @the_drow:我不这么认为。编写良好的代码会在此处使用括号以使编译器和其他程序员都清楚其意图。
  • 碰巧,这已经在 comp.lang.c 常见问题解答中。请参阅我的答案以获取链接。
  • @Ben Voigt:你多久看到一次这样的代码?我以前见过。常见问题解答应该包含您不应该做的事情,并且应该建议不要这样做。
  • @aix:是的,但是在stackoverflow中也有一个c++的faq标签。
  • @Ben:while(*p++) 是非常经典的 C 语言之一,自从 K&R 在 40 年前将其固定下来,没有人用括号编写它。

标签: c++ pointers operators


【解决方案1】:

Post-increment (++) has higher precedence than dereference (*). 这意味着++ 绑定到pointer 而不是*pointer

请参阅C FAQ 4.3 和其中的参考资料。

【讨论】:

  • 但这意味着什么。
  • 更高的优先级意味着它在前面,所以指针增加了sizeof(*pointer),并且由于它是一个后缀运算符,它返回旧的指针。然后 * 运算符检索旧指针指向的内容。 (当然优化器可能会更改操作顺序以更快地获得相同的结果)
【解决方案2】:

好了,参数的绑定大家已经解释过了。
但是没有人提到它的含义。

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;

但是运算符 ++ 是后缀版本。这意味着指针会递增,但操作的结果会返回原始值以供 * 运算符使用。因此我们可以将语句修改如下;

std::cout << *pointer << std::endl;
pointer++;
std::cout << *pointer << std::endl;

所以输出的结果是当前指向的整数,但指针也会递增。所以打印的值是

1
2

不是

2
3

【讨论】:

    【解决方案3】:

    ++ 的优先级高于*,因此您的表达式等价于*(pointer++)——它取消引用值,然后递增指针,而不是值。如果你想增加值,你需要做(*pointer)++

    【讨论】:

    • 该值是指向(后)增量之前的值。它不会增加指针,然后返回指向的新值。
    【解决方案4】:

    和做是一样的

    *(pointer++)
    

    因为它增加了指针持有的地址,然后它取消引用它。

    【讨论】:

    • 这也是应该的写法,所以不会混淆。
    • @Ben:也许吧,但值得商榷。您是否还建议将a * b + c 写为(a * b) + c?或者您会依靠有能力的程序员来了解优先规则?
    • @Stuart:我希望任何阅读我的代码的人都知道优先规则是相同的,无论语言如何。这几乎只意味着数学优先级。
    【解决方案5】:

    *pointer++ 表示*(pointer++)

    即,它增加指针,而不是指针。

    记住这一点的一种方法是阅读原始的 K&R “The C Programming Language”,他们的 strcpy 示例使用了这个。

    不管怎样,我就是这样记住优先级的。

    并且由于它增加了指针,您的第二个取消引用具有未定义的行为。

    干杯,

    【讨论】:

      【解决方案6】:

      你是在增加指针的值,而不是它所指向的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 2014-03-23
        • 2018-12-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-26
        相关资源
        最近更新 更多