【问题标题】:Why do pointers behave differently when operated by post increment oparator?为什么使用后自增运算符操作时指针的行为会有所不同?
【发布时间】:2018-12-03 03:20:58
【问题描述】:

我们来看第一个代码:

以下代码显示n=10的值:

#include<iostream>
int main()
{
    int n=10;
    int*p=&n;
    *p++;
    std::cout<<n;
    return 0;
}

以下代码显示n=11的值:

#include<iostream>
int main()
{
    int n=10;
    n++;
    std::cout<<n
    return 0;
}

【问题讨论】:

  • 看起来好像只有存储在 p 中的地址增加了。尝试在取消引用的指针周围放置一些括号
  • 还应该指出 *(p++) 不可移植,因为您正在修改指向不属于数组的内存的指针(它甚至可能是未定义的行为,不太确定,无论如何您除非你真的知道自己在做什么,否则永远不要这样做)。

标签: c++ pointers post-increment


【解决方案1】:

运算符优先级。

第一种情况被解析为*(p++); - 首先增加地址然后取消引用。这不会修改任何值。

第二种情况只是增加值本身。

【讨论】:

  • 关于顺序的说明:增量是在指针上完成的,但它是指针的 old 值被取消引用。否则,如果它是被取消引用的递增指针(如*++p),那么它将是未定义的行为
  • ISO/IEC 14882 [expr.post.incr] 说:后缀 ++ 表达式的值是其操作数的值。 即递增之前的值.
【解决方案2】:

p++ 增加指针。您需要(*p)++ 来增加该值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2011-09-04
    • 2021-09-26
    • 2019-09-28
    • 2015-11-09
    • 2019-07-03
    相关资源
    最近更新 更多