0

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

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

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

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

运行没有问题,除了 head 增加到快。所以有什么问题?

4

4 回答 4

2

试试这个。

return data[head++];

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

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

于 2013-09-15T16:39:51.363 回答
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];
}
于 2013-09-15T16:50:13.897 回答
1

我想你想要的是这样的:

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

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

于 2013-09-15T16:51:56.133 回答
0

首先,你需要知道++i 和 i++ 有什么区别?.

在您的情况下,您希望:

  1. 读你datahead
  2. 移动你的head
  3. 返回读入 1 的值。

所以,在代码中它看起来像这样:

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

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

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

return data[head++];

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

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


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

于 2013-09-15T16:57:37.350 回答