返回后增加

时间:2013-09-15 16:38:04

标签: c++

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

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

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

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

运行没有问题,除了头增加到快。那有什么问题?

4 个答案:

答案 0 :(得分:2)

试试这个。

return data[head++];

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

后递增++运算符有时在评估head++表达式之后和分号之前递增值。但确切的时间是未定义的和编译器相关的。因此,永远不要在同一语句中使用多个x++表达式。

答案 1 :(得分: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];
}

答案 2 :(得分:1)

我认为你想要的是:

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

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

答案 3 :(得分:0)

首先,您需要了解What is the difference between ++i and i++?

在您的情况下,您想要:

  1. data
  2. 上阅读head
  3. 移动您的head
  4. 返回1中读取的值。
  5. 所以,在代码中它看起来像:

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

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

    如果你愿意,你可以在一行中编写这个函数,但是会失去可读性(通常只有一行语句更好,这种方式更不容易出错):

    return data[head++];
    

    这是有效的,因为head++增加变量但返回其“旧”值。

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


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