62
public void increment(){
    int zero = 0;

    int oneA = zero++; // Compiles

    int oneB = 0++; // Doesn't compile

    int oneC = getInt()++; // Doesn't compile
}

private int getInt(){
    return 0;
}

それらはすべてintですが、なぜB&Cはコンパイルされないのですか?++演算子との違いと関係があり= 0 + 1;ますか?

操作に対する無効な引数++/--

4

11 に答える 11

149

i++変数への代入ですi

あなたの場合、zero++はと同等zero = zero + 1です。つまり、0++意味0 = 0 + 1がない、およびを意味しgetInt() = getInt() + 1ます。

より正確に :

int oneA = zero++;

意味

int oneA = zero;
zero = zero + 1; // OK, oneA == 0, zero == 1

int oneB = 0++;

意味

int oneB = 0;
0 = 0 + 1; // wrong, can't assign value to a value.

int oneC = getInt()++;

意味

int oneC = getInt();
getInt() = getInt() + 1; // wrong, can't assign value to a method return value.

より一般的な観点から、変数はL値であり、これはメモリ位置を参照するため、割り当てることができることを意味します。L値のLは、L値が代入演算子の左側または右側にある場合でも(たとえば) 、代入演算子の左側を表します(つまり)。=x = y

反対はR値ですRは代入演算子の右側を表します)。R値は、L値に何かを割り当てるために、代入ステートメントの右側でのみ使用できます。通常、R値はリテラル(数値、文字列など)とメソッドです。

于 2013-03-08T10:32:43.477 に答える
29

JLSで述べられているように :

接尾辞式の結果は、数値型(§5.1.8)に変換可能な型の変数である必要があります。そうでない場合、コンパイル時エラーが発生します。

于 2013-03-08T10:32:12.093 に答える
14

getInt()ではありませんint

getInt()戻り値int

++オペレーターは2つのことを行いますincrement+assignment

したがって、++演算子が機能するには、インクリメント操作の結果を格納する変数が必要ですが0getInt()どちらもそうではありません。

于 2013-03-08T10:32:36.907 に答える
10

事前演算子と事後演算子は、呼び出された変数または左辺値のみを操作します。lvalueは、left valueの略で、つまり、割り当ての左側に立つことができるものです。あなたの例では:

    zero = 1; // OK
    0 = 1; // Meaningless
    getInt() = 1; // Also meaningless

// jk

于 2013-03-08T10:35:20.950 に答える
5

BとCはどちらも、コンパイラに次のように言わせます。

予期しないタイプ、必須:変数、検出:値

したがって、値をインクリメントすることはできず、変数のみをインクリメントできます。

于 2013-03-08T10:32:11.540 に答える
4

ポストインクリメント演算子がintを返すメソッドで機能しないのはなぜですか?

これはゲッターメソッドであり、ゲッターを介して値を変更することは意味がないためです。


int z = x + y++;

と同等です:

int z = x + y;
y = y + 1;

したがって、次のようなものを持つことは無効です。

int z = x + getY()++;

これは次と同等です:

int z = x + getY();
getY() = getY() + 1; // invalid!
于 2013-03-08T10:34:21.110 に答える
3

0 ++

それは同等で0 = 0 + 1;あり、確かにそれは不可能です。

つまり、それl-valueに割り当てる必要があります。

getInt()++;

ここで同様の理由。

于 2013-03-08T10:34:45.380 に答える
2

0は(つまり、代入演算子の右側からrValueのみ使用できます)not a lValueです。

++演算子は値をインクリメントしてそれ自体に設定するため0++、エラーが発生します。

于 2013-03-08T10:32:44.293 に答える
1

私の答えは、そのような「箱から出して」です。

演算子の使用法に疑問がある場合、この演算子の「オーバーロードされた関数はどれに相当するか」と思いますか?

私は、Java演算子には演算子のオーバーロードがないことを知っています。これは、ソリューションを作成するための単なる代替方法です。

この場合:

...
x++;
...

次のように読む必要があります:

...

int /* function */ postincrement (/* ref */ int avalue)
{
  int Result = avalue;

  // reference value, 
  avalue = avalue + 1;

  return Result;
}

...
postincrement(/* ref */ x);
...

と:

...
++x;
...

...

int /* function */ preincrement (/* ref */ int avalue)
{
  // reference value, 
  avalue = avalue + 1;

  int Result = avalue;

  return Result;
}

...
preincrement(/* ref */ x);
...

したがって、両方のバージョンの「++」は、参照によって変数パラメーターを受け取る関数として機能します。

したがって、「0 ++」のようなリテラル値または「getInt()++」のような関数結果は、変数参照ではありません。

乾杯。

于 2013-03-15T18:11:31.540 に答える
0

postincrementとpreincrementは、変数を使用した場合にのみ適用できます。したがって、最初のケースはコンパイルされます。

于 2013-03-13T06:33:05.130 に答える
0

関数の戻りはRHS式であるため、プリ/ポストインクリメント/デクリメント操作はLHS式にのみ適用できます。

于 2013-03-19T11:53:51.487 に答える