26

例如,如果我有一个带有实例方法和变量的类

class Foo
{

   ...

   int x;
   int bar() { return x++; }
 };

返回后递增变量的行为是否已定义?

4

7 回答 7

53

Yes, it's equivalent to:

int bar()
{
  int temp = x;
  ++x;
  return temp;
}
于 2010-03-04T16:19:16.563 回答
11

是的……它会在增加 x 之前返回 x 的值,之后 x 的值将是 + 1 ……如果重要的话。

于 2010-03-04T16:16:09.873 回答
6

It is defined.

It returns the value of x before incrementation. If x is a local(non-static) variable this post incrementation has no effect since local variables of a function cease to exist once the function returns. But if x is a local static variable, global variable or an instance variable( as in your case), its value will be incremented after return.

于 2010-03-04T16:19:07.077 回答
6

Yes.

In postincrement (x++) the value of x is evaluated (returned in your case) before 1 is added.

In preincrement (++x) the value of x is evaluated after 1 is added.

Edit: You can compare the definition of pre and post increment in the links.

于 2010-03-04T16:20:22.707 回答
2

大多数编程语言,如 C++,都是按照执行操作的顺序递归的(我没有暗示这里的代码是如何由编译器实际实现的)。由任何定义良好的操作组成的复合操作本身就是定义良好的,因为每个操作都是在后进先出的基础上执行的。

Post-increment在递增变量之前返回要递增的变量的值,因此return操作会接收该值。不必对此行为进行特殊定义。

于 2010-03-04T18:28:59.960 回答
1

我知道这个问题很久以前就得到了回答,但这就是定义它的原因。复合运算符基本上是函数的语法糖。如果你想知道从函数返回后增量是如何发生的,它不会。它发生在运算符“function”返回前一个值之前。

对于整数,请考虑如下定义的后自增运算符函数:

int post_increment(int *n)
{
    int temp = *n;
    *n = *n + 1;
    return temp;
}
于 2019-09-26T14:39:36.587 回答
0

我认为它已定义但不是首选。它给人们带来了困惑。例如,以下代码打印 1 而不是 2。

#include <iostream>
#include <cstdlib>

using namespace std;

int foo()
{
    int i = 1;
    return i++;
}

int main()
{
    cout << foo() << endl;

    return 0;
}
于 2018-07-20T18:04:00.560 回答