【问题标题】:The unary increment operator in pointer arithmetic指针算术中的一元自增运算符
【发布时间】:2011-05-30 18:50:33
【问题描述】:

这是我的第一篇文章。

我有这个函数用于在 C 中反转字符串 我发现的。

    void reverse(char* c) {
        if (*c != 0) {
            reverse(c + 1);
        }
        printf("%c",*c);
    }

它工作正常,但如果我更换:

reverse(c + 1);

与:

reverse(++c);

原始字符串的第一个字符被截断。我的问题是为什么会是 在这种情况下语句不等效?

谢谢

【问题讨论】:

  • 如果您将printf 调用中的*c 更改为*--c,它将正常工作。

标签: c pointers increment operator-keyword


【解决方案1】:

因为c + 1 不会改变c 的值,而++c 会。

【讨论】:

    【解决方案2】:

    c + 1 不会改变c

    ++c 递增 c,然后在替换的递归调用中使用新值 reverse(++c)

    【讨论】:

      【解决方案3】:

      让我们稍微扩展一下 Fred 的答案。 ++c 等价于c = c+1,而不是c+1。如果将行 reverse(c+1) 替换为 reverse(++c),则 c 会更改。就递归调用而言,这无关紧要(为什么?),但意味着 c 指向 printf 中的某个新位置。

      【讨论】:

        【解决方案4】:

        如前所述,++c 会更改 c 的值,但 c+1 不会。

        这在递归调用本身中无关紧要:reverse(c+1)reverse(++c) 会将相同的值传递给 reverse;当您在递归调用之后在printf 中使用c 时会发生差异——在++c 的情况下,c 的值在您到达printf 时已更改。

        【讨论】:

          猜你喜欢
          • 2019-06-06
          • 2015-10-21
          • 2011-06-30
          • 1970-01-01
          • 1970-01-01
          • 2019-05-22
          • 2014-04-10
          • 2018-05-14
          • 1970-01-01
          相关资源
          最近更新 更多