26

たとえば、インスタンスメソッドと変数を持つクラスがある場合

class Foo
{

   ...

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

ポストインクリメントされた変数を返す動作は定義されていますか?

4

7 に答える 7

53

はい、それは以下と同等です:

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

はい、そうです...インクリメントする前にxの値を返し、その後、xの値は+1になります...重要な場合。

于 2010-03-04T16:16:09.873 に答える
6

定義されています。

xインクリメント前の値を返します。xがローカル(非静的)変数の場合、関数が戻ると関数のローカル変数は存在しなくなるため、このポストインクリメントは効果がありません。ただし、xがローカル静的変数、グローバル変数、またはインスタンス変数(あなたの場合のように)である場合、その値は戻り後にインクリメントされます。

于 2010-03-04T16:19:07.077 に答える
6

はい。

postincrement(x ++)では、1が追加される前に、xの値が評価されます(この場合は返されます)。

preincrement(++ x)では、1が追加された後にxの値が評価されます

編集:リンク内の事前増分と事後増分の定義を比較できます。

于 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

私はそれが定義されていると思いますが、好ましくありません。それは人々に混乱を引き起こします。たとえば、次のコードは2ではなく1を出力します。

#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 に答える