如果我有一个带有实例方法和变量的类
class Foo
{
...
int x;
int bar() { return x++; }
};
是否定义了返回后递增变量的行为?
答案 0 :(得分:40)
是的,它相当于:
int bar()
{
int temp = x;
++x;
return temp;
}
答案 1 :(得分:7)
是的......它会在递增之前返回x的值,之后x的值将为+ 1 ......如果重要的话。
答案 2 :(得分:5)
是强>
在postincrement
(x ++)中,在添加 1之前,评估x的值(在您的情况下返回)。
在preincrement
(++ x)中,在 1添加后,评估x的值。
答案 3 :(得分:4)
已定义。
在递增之前返回x
的值。如果x
是本地(非静态)变量,则此后增量无效,因为函数的局部变量在函数返回后不再存在。但是,如果x
是本地静态变量,全局变量或实例变量(如您的情况),则其值将在返回后递增。
答案 4 :(得分:2)
大多数编程语言,比如C ++,都是按照执行操作的顺序递归的(我对这里的编译器实际实现的代码没有任何影响)。由任何定义明确的操作组成的复合操作本身已经很好地定义,因为每个操作都是在后进先出的基础上执行的。
后递增返回在递增之前递增的变量的值,因此return
操作接收该值。不必对此行为做出特殊定义。
答案 5 :(得分:0)
我认为它是已定义但不是首选。它使人们感到困惑。例如,以下代码显示1而不是2。
#include <iostream>
#include <cstdlib>
using namespace std;
int foo()
{
int i = 1;
return i++;
}
int main()
{
cout << foo() << endl;
return 0;
}
答案 6 :(得分:0)
我知道这个问题早已得到解答,但这就是为什么要对其进行定义。 复合运算符基本上是函数的语法糖。 如果您想知道从函数返回后增量是如何发生的,则不会。它恰好在运算符“功能”返回之前的值之前发生。
对于整数,请考虑如下定义的后增量运算符函数:
int post_increment(int *n)
{
temp = *n;
*n = *n + 1;
return temp;
}