【问题标题】:difference between *p++ and *p++=*q*p++ 和 *p++=*q 的区别
【发布时间】:2016-06-05 14:50:35
【问题描述】:

在这段代码中,如果我写“*p++=*q”而不是“*p++”,则没有任何变化。为什么?

int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p=a, *q=&a[8];

*p++;

printf("%d  \n", *p);
printf("%d  \n", *q);
printf("%d  \n", p);
printf("%d  \n", q);

【问题讨论】:

  • 注:printf("%d \n", p); --> UB.
  • 您希望改变什么,为什么?
  • 有些变化。您只是看不到发生了什么变化,因为您不看它。
  • *p++ = 增加指针 (*p)++ = 增加指向的内容
  • @Destructor 既然你提出了这个话题,让我告诉你,UB 是任何地方的主要问题。任何拥有 UB 的代码都不能被信任做任何理智的事情。

标签: c


【解决方案1】:

*p++; 表示

  1. 递增p 并在递增之前获取其值
  2. 取消引用值
  3. 把结果扔掉

*p++=*q; 表示

  1. 递增 p 并在递增之前获取其值
  2. 取消引用值以了解存储位置
  3. 取消引用q
  4. 存储读取的数据

(实际评估顺序未指定,可能有所不同)

改变它确实改变了。您没有观察到变化,因为您没有检查存储在 p[-1] 中的值(p 是递增后的值)。

注意线条

printf("%d  \n", p);
printf("%d  \n", q);

通过将具有错误值的数据传递给printf 来调用未定义的行为。线条应该是

printf("%p  \n", (void*)p);
printf("%p  \n", (void*)q);

使用%p 说明符并将要打印的指针转换为void* 以通过printf 打印指针。

【讨论】:

    【解决方案2】:

    你的问题是错误的。你声称“没有任何变化”并问为什么。

    现实情况是,某事发生了变化。但不是你正在看的任何东西。去看看发生了什么变化。

    最重要的是,使用 %d 修饰符打印 p 和 q 是未定义的行为。

    我的钱包里有 5 英镑。我在袜子里放了 10 英镑。我检查了我的钱包,我的钱包里还有 5 英镑。没有改变。为什么?

    【讨论】:

    • 除非你说做了什么改变,否则作为评论更好(事实上你确实将它作为评论发布,那么为什么还要发布非答案呢?) .
    • 逻辑上有效的问题仍然可以基于不正确的假设,恕我直言,@alk
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多