たとえば、インスタンスメソッドと変数を持つクラスがある場合
class Foo
{
...
int x;
int bar() { return x++; }
};
ポストインクリメントされた変数を返す動作は定義されていますか?
たとえば、インスタンスメソッドと変数を持つクラスがある場合
class Foo
{
...
int x;
int bar() { return x++; }
};
ポストインクリメントされた変数を返す動作は定義されていますか?
はい、それは以下と同等です:
int bar()
{
int temp = x;
++x;
return temp;
}
はい、そうです...インクリメントする前にxの値を返し、その後、xの値は+1になります...重要な場合。
定義されています。
x
インクリメント前の値を返します。x
がローカル(非静的)変数の場合、関数が戻ると関数のローカル変数は存在しなくなるため、このポストインクリメントは効果がありません。ただし、x
がローカル静的変数、グローバル変数、またはインスタンス変数(あなたの場合のように)である場合、その値は戻り後にインクリメントされます。
C ++のようなほとんどのプログラミング言語は、操作が実行される順序で再帰的です(ここでは、コードがコンパイラーによって実際にどのように実装されるかについては何の意味もありません)。各操作は後入れ先出し方式で実行されるため、明確に定義された操作で構成される複合操作は、それ自体が明確に定義されています。
Post-incrementは、インクリメントする前にインクリメントされている変数の値を返すため、return
操作はその値を受け取ります。この動作を特別に定義する必要はありません。
私はこの質問がずっと前に答えられることを知っています、しかしこれがそれが定義される理由です。複合演算子は、基本的に関数のシンタックスシュガーです。関数から戻った後に増分がどのように発生するのか疑問に思っている場合は、そうではありません。これは、演算子「function」が前の値を返す直前に発生します。
整数の場合、次のように定義されたポストインクリメント演算子関数を考えてみてください。
int post_increment(int *n)
{
int temp = *n;
*n = *n + 1;
return temp;
}
私はそれが定義されていると思いますが、好ましくありません。それは人々に混乱を引き起こします。たとえば、次のコードは2ではなく1を出力します。
#include <iostream>
#include <cstdlib>
using namespace std;
int foo()
{
int i = 1;
return i++;
}
int main()
{
cout << foo() << endl;
return 0;
}