オペレーターがどのように機能するかについては、一般的に理解が不足しています。正直なところ、すべての演算子は糖衣構文です。
あなたがしなければならないのは、すべてのオペレーターの背後で実際に何が起こっているのかを理解することです。次のように想定します。
a = b -> Operators.set(a, b) //don't forget this returns b
a + b -> Operators.add(a, b)
a - b -> Operators.subtract(a, b)
a * b -> Operators.multiply(a, b)
a / b -> Operators.divide(a, b)
次に、これらの一般化を使用して複合演算子を書き直すことができます(簡単にするために戻り型は無視してください)。
Operators.addTo(a, b) { //a += b
return Operators.set(a, Operators.add(a, b));
}
Operators.preIncrement(a) { //++a
return Operators.addTo(a, 1);
}
Operators.postIncrement(a) { //a++
Operators.set(b, a);
Operators.addTo(a, 1);
return b;
}
あなたはあなたの例を書き直すことができます:
int a = 3;
a = (a++) * (a++);
なので
Operators.set(a, 3)
Operators.set(a, Operators.multiply(Operators.postIncrement(a), Operators.postIncrement(a)));
これは、複数の変数を使用して分割できます。
Operators.set(a, 3)
Operators.set(b, Operators.postIncrement(a))
Operators.set(c, Operators.postIncrement(a))
Operators.set(a, Operators.multiply(b, c))
その方が確かに冗長ですが、1行で2つ以上の操作を実行したくないことがすぐに明らかになります。