【问题标题】:Incrementation after return返回后递增
【发布时间】:2013-09-15 16:38:04
【问题描述】:

我认为这是一个非常简单的问题......我有一些这样的代码:

//head is somewhere initialized with 0 (int head=0;)
char testclass::read() {
    return data[head];
    ++head;
}

当我尝试运行它时,我创建了一个循环。将其更改为:

char testclass::read() {
    ++head;
    return data[head];
}

运行没有问题,除了 head 增加为快。那么有什么问题呢?

【问题讨论】:

  • return 从函数返回。之后的任何事情都不会发生。
  • head 增长太快是什么意思?每次调用该函数时它都会递增一次。
  • 当你尝试运行它时你创建了一个循环是什么意思?
  • 我想知道为什么这个问题被否决了。 StackOverflow 是一个英文网站这一事实并不意味着它的所有用户都将英语作为母语。从上下文中可以清楚地理解“禁食”:为时过早。无论如何,我赞成它来补偿。 :-)

标签: c++


【解决方案1】:

试试这个。

return data[head++];

在您的第一个解决方案++head 之后,返回的是死代码。永远不会运行,它可能已经在编译时被丢弃了。在您的第二个解决方案中,head 在您返回时已经增加。太早了。

后递增 ++ 运算符有时会在 head++ 表达式的计算之后和分号之前递增值。但是确切的时间是未定义的并且取决于编译器。因此,切勿在同一语句中使用多个 x++ 表达式。

【讨论】:

  • 你能解释一下这个答案吗,顺便说一句,我不是反对者。
  • post-inc 的描述虽然适用于 OP,但并不准确。术语head++ 作为 eval 表达式本质上意味着取 head 的当前值,记住它,增加 head,然后使用原始值作为 eval 结果。换句话说,head isdata 被下标之前递增,但它不是heads 用于下标的值。它是增量 prior 的值。通过函数调用和用作增量操作的全局变量可以轻松证明这一点。
  • 后增量不会在“head++ 评估之后”增加。这可能是关于测序前和测序后最普遍和最危险的误解之一。关于head++ 的关键点在于它评估为head 的旧的原始值。这就是我们所知道的,也是我们需要知道的。实际增量发生在什么时候——之前、之后、中间的某个地方——没人知道,这并不重要。
  • 这里肯定有一些误解,因为我们都说同样的事情。 :-)
【解决方案2】:

你可以这样做:

return data[head++];

因为定义了返回后递增变量的行为。

int foo() { return x++; }

相当于:

int foo()
{
  int temp = x;
  ++x;
  return temp;
}

在你的例子中:

return data[head++];

将等同于:

{
  int temp = head;
  ++head;
  return data[temp];
}

【讨论】:

  • +1 用于 post-inc 的行为示例。你可能不会惊讶有多少教授不知道它是这样工作的。
【解决方案3】:

我想你想要的是这样的:

char testclass::read() {
    char result = data[head];
    ++head;
    return result;
}

但正如SzG所说,这可以缩写为return data[head++];

【讨论】:

    【解决方案4】:

    首先,您需要知道What is the difference between ++i and i++?

    在你的情况下,你想要:

    1. 阅读您的datahead
    2. 移动你的head
    3. 返回在 1 中读取的值。

    所以,在代码中是这样的:

    char testclass::read() {
        char result = data[head];     // 1
        head += 1;                    // 2
        return result;                // 3
    }
    

    现在,您可以在此处使用++headhead++ 代替head += 1。它不会改变你的函数的行为,因为这个语句的结果没有被使用(即你可以x = y += 1;但可能不想做。)

    如果你愿意,你可以把这个函数写成一行,但是会损失可读性(通常最好一行一行只写一个语句,这样更不容易出错):

    return data[head++];
    

    这是因为head++ 增加了变量但返回了它的“旧”值。

    但不要认为三行代码更快:您的编译器足够聪明,可以优化它,并且很可能会为两种实现生成相同的汇编代码。


    关于函数的第一个版本,不要忘记返回语句后的代码不会执行。 (例如,请参阅此 SO Execution of code in a function after the return statement has been accessed in c++

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多