私はKotlinに、数字のすべてのタイプにすでにunaryPlus
とunaryMinus
の演算子が定義されていることに気付きました。Kotlin:単項プラスマイナス演算子は数値に対して何をしますか?
これらの演算子の目的は何ですか?彼らは何らかの形でinc
とdec
のプレフィックス形式に接続されていますか?
私はKotlinに、数字のすべてのタイプにすでにunaryPlus
とunaryMinus
の演算子が定義されていることに気付きました。Kotlin:単項プラスマイナス演算子は数値に対して何をしますか?
これらの演算子の目的は何ですか?彼らは何らかの形でinc
とdec
のプレフィックス形式に接続されていますか?
その他unaryMinus
とunaryPlus
の基本的な意味を定義して、そして実際に数値型に、彼らは実際にも、関数として呼び出すことがないかもしれません。
ILOAD 1
ISTORE 2
、コードを-x
またはx.unaryMinus()
が同じバイトコード生成:例えば、+x
又はx.unaryPlus()
コーディングする(x
はInt
型である)、同じバイトコードを生成
ILOAD 1
INEG
ISTORE 2
をしかし、より行くありますその上で...
なぜコンパイラは+x
? +x
とx.unaryPlus()
は何もしないと言う人もいますし、-x
とx.unaryMinus()
は符号を逆転させるだけです。それは正しくありません。 Javaでは、拡大と展開解除が含まれる可能性があるため、より複雑です(Unary Numeric Promotionを参照)。これらの演算子の完全な結果を説明します。これは、ボックス化された値とタイプがInt
より小さい場合に影響します。 Short
およびByte
の値の場合、これらの演算子は、タイプがInt
に広げられた新しいボックス化されていない値を返します。そして、両方の演算子がこのより隠された機能を持つので、+x
が何もしないと思っても、両方ともバイトコードを生成する必要があります。ちなみに、これはC言語と同様で、Usual Arithmetic Conversionsと呼ばれています。
したがって、このコードは無効です:基本数値型にこれらの数値例で
val x: Short = 1
val y1: Short = +x // incompatible types
val y2: Short = x.unaryPlus() // incompatible types
val z1: Short = -x // incompatible types
val z2: Short = x.unaryMinus() // incompatible types
彼らはこれらの演算子のアイデアは、あなたがしたい場合がありますオペレータ機能と同一視することを可能にするために魔法をコンパイラしています他のクラスでは過負荷になります。
な演算子のオーバーロードなど、他の用途のために...
しかし、彼らはただ、数学的使用よりもそこにあり、オペレーターとして、任意のクラスで使用することができます。 Kotlinは演算子を関数として公開し、unaryMinus
とunaryPlus
を含む特定の演算子のセットにoperator overloadingを適用できます。
これらを使用して、自分自身または既存のクラスの演算子を定義することができます。たとえば、私はThings
は、オプションの有限集合の内容を否定するunaryMinus()
オペレータと一緒に列挙クラスですSet<Things>
あります
enum class Things {
ONE, TWO, THREE, FOUR, FIVE
}
operator fun Set<Things>.unaryMinus() = Things.values().toSet().minus(this)
をそして私は、私はいつでも私のenumセットを否定することができます
val current = setOf(Things.THREE, Things.FIVE)
println(-current) // [ONE, TWO, FOUR]
println(-(-current)) // [THREE, FIVE]
修飾子operator
で拡張機能を宣言しなければならないことに注意してください。これは機能しません。コンパイラは、演算子を使用しようとするときにこれを忘れた場合に通知します。
Error:(y, x) Kotlin: 'operator' modifier is required on 'unaryMinus' in 'com.my.favorite.package.SomeClass'
これらの演算子の目的は、書くことができるようにすることです:
val a = System.nanoTime()
val b = -a // a.unaryMinus()
val c = +b // b.unaryPlus()
彼らは一緒に使用することができますが++
/inc
と--
/dec
事業者に直接関係はありません。次の式は異なっている
お知らせ:
--a // a = a.dec()
-(-a) // a.unaryMinus().unaryMinus()
これらの演算子は、整数の兆候です。
+5
コール5.unaryPlus()
とリターン5
-5
コール5.unaryMinus()
と戻る-5:ここではいくつかの例です。
-(-5)
通話5.unaryMinus().unaryMinus()
とリターン5
多くの意味があります。 – Jire
本当に完全な答えです。ありがとう! – Jire