我认为这是一个非常简单的问题......我有一些像这样的代码:
//head is somewhere initialized with 0 (int head=0;)
char testclass::read() {
return data[head];
++head;
}
当我尝试运行它时,我创建了一个循环。将其更改为:
char testclass::read() {
++head;
return data[head];
}
运行没有问题,除了头增加到快。那有什么问题?
答案 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++?。
在您的情况下,您想要:
data
head
head
所以,在代码中它看起来像:
char testclass::read() {
char result = data[head]; // 1
head += 1; // 2
return result; // 3
}
现在,您可以在此使用++head
或head++
代替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++)