0
class cls
{ 
    int x;
public: 
    cls(int i=-20) { x=i; }
    int f() { return x; }

int main()
{ 
    cls a(14);
    int b;
    b=a.f()++;
    cout<<b;
    return 0;
}

この行で「インクリメントオペランドとして必要な左辺値」を取得していますb=a.f()++;。に変更するとb=++a.f();同じエラーが発生しますが、変更すると正常にb=a.f()+1;動作します。++前置オペランドまたは後置オペランドがある場合、コンパイラはどのように考え++ますか? a++(or ++a) とa=a+1( aint 型の場合)の違いは何ですか?

4

2 に答える 2

4

次のように考えてください。

expression++

の省略形です

expression = expression + 1

の省略形ではありません

expression + 1

関数呼び出しで展開します。

a.f() = a.f() + 1

f()参照など、割り当て可能なものを返さない限り、上記は意味がありません。したがって、式は無効です。

ただし、関数が参照によって返された場合、代入は可能です。

int& f() {
    return x;
}

これで、式a.f()++との両方a.f() = a.f()+1が完全に理にかなっています。変更されるのはx内部aであるため、プログラムはコンパイルされます。

于 2013-06-09T20:58:42.747 に答える
4

の結果f()一時的な. 一時整数をインクリメントすることはできません...

于 2013-06-09T20:56:28.057 に答える