プリミティブ型へのキャストによる奇妙なJavaの動作

これはおそらくどこかで尋ねられたが、私はそれを見つけることができなかった。誰かがこのコードをコンパイルして 1 を印刷する理由を明確にすることができますか?

long i = (byte) + (char) - (int) + (long) - 1;
System.out.println(i);
28
これは元の投稿で説明されています。 vanillajava.blogspot.com/2011/10/java -plus.html ;)
追加された 著者 Peter Lawrey,
私はそれが奇妙に見えると思う。誰かがそれを見て、法的なJavaであったとは信じていないと信じていても問題はありません。
追加された 著者 Dave Newton,
@PrinceJohnWesley:まあ、それは奇妙に見えますか?答えは簡単ですが、私は質問を投稿した直後にそれを理解しました。
追加された 著者 Denis Tulskiy,
ここで何が変だ?
追加された 著者 Prince John Wesley,
ロングj = + - + - - + - + - + - + - +1; //これも正当です。 ++または - が発生しない限り。
追加された 著者 david van brink,

3 答え

これは次のように解析されています:

long i = (byte)( +(char)( -(int)( +(long)(-1) ) ) );

すべての +- 演算子は単項 + または - です。

この場合、 1 は2回ネゲートされ、 1 として出力されます。

42
追加された

'+'と ' - 'はどちらも単項演算子なので、キャストはそれらの単項式のオペランドを処理しています。残りは数学です。

5
追加された

単項演算子とキャスト:)

+1は合法です

(バイト)+ 1はバイトに+1をキャストしています。

卑劣なこと!私は考えさせました。

5
追加された