【问题标题】:What is the out put of this code any why? [closed]这段代码的输出是什么,为什么? [关闭]
【发布时间】:2013-05-24 16:01:25
【问题描述】:

我有一个 C++ 函数,我知道会是什么,但为什么?

int c[5];
int* pc = c;

for (int i = 0; i < 5; i++)
{
    c[i] = i*2;
}
*pc++;
printf("%d\n", pc-c );

【问题讨论】:

  • 你为什么不run呢?
  • 输出是1,这是地址的差异
  • 我不会破坏结果,但“为什么”这个问题的答案是“因为代码”。
  • This 也很有帮助
  • @huseyintugrulbuyukisik:不,它会打印出1

标签: c++ c pointers printf


【解决方案1】:

有很多垃圾代码在发生。这是唯一对打印很重要的事情:

int c[5];              // c is a pointer
int* pc = c;           // pc points to the same thing as c.
pc++;                  // pc now points to one-past-where-c-points-to
printf("%d\n", pc-c ); // will print the pointer differences. 1.

注意

*pc++;

其实就是

*(pc++);

不同
(*pc)++;

如有疑问,请始终使用括号。

【讨论】:

  • 这让我想起了a Dan Saks' article 中关于运算符优先级的那句老话(强调我的):“当对优先级有疑问时,用括号括起来。当确定优先级时,括号。在任何一种情况下,如果你错了,你的程序仍然可以工作,没有人会更聪明。”无疑是一个明智的建议:)(即使你没有错,下一位读者/您的代码的维护者可能会感到困惑。)
【解决方案2】:

地址距离

似乎代码试图在内存寻址空间中显示指针pcc 的距离。

  1. int* pc = c; : pc 指向 c 指向的位置。 (这里pc = c

  2. *pc++;pc增加了一个(这里是pc = c + 1

  3. pc - c : pc - c = 1 : 距离(它们之间的整数个数)

 

 +------+------+------+------+------+
 |      |      |      |      |      |
 +------+------+------+------+------+
 ^      ^
 c      pc

您可以在 C++ 标准的 §5.7 中阅读定义明确的指针算法 [expr.add]。

【讨论】:

  • 或者,如果进行指针运算不是未定义的行为,我可以发誓将指针传递给 %d 也是如此。
  • @chris:在减法的时候,pc-cpc指向c[1],所以pc-c是1。传递给printf的参数不是指针;这是ptrdiff_t
  • @chris pc-cptrdiff_t 不是指针,它可能匹配也可能不匹配 %d
  • @chris:你为什么说算术是未定义的?据我所见,它保持在数组范围内。
  • @EricPostpischil,对,不是指针。我对算术很笨。出于某种原因,我认为它是在减去一个数字(大到最终得到的地址为 1)。你的大脑在欺骗你是一种糟糕的感觉。
【解决方案3】:

输出是1,因为它减去地址并返回差值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2018-04-26
    • 2016-04-20
    • 1970-01-01
    • 2018-01-08
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多