[英]Java: Conditional Operator differs from if/else
為什么條件運算符返回2.0並且if / else塊在以下示例中返回2? 我有點困惑,因為這兩個塊應該相等:
如果別的:
double value = 2.0;
Object result;
if (value == Math.floor(value)) {
result = ((int) value);
} else {
result = value;
}
有條件的操作員:
double value = 2.0;
Object result;
result = value == Math.floor(value) ? ((int) value) : value;
但是,命令
System.out.println(result);
打印2.0或2
謝謝你的幫助!
兩種情況都采用相同的分支。 您可以通過對不同分支使用非常不同的答案來驗證:
if (value == Math.floor(value)) {
result = ((int) value * 100);
} else {
result = value;
}
和
result = value == Math.floor(value) ? ((int) value * 100) : value;
在這兩種情況下,您將獲得200或200.0。
另一個驗證方法是通過使條件不變來刪除條件:
boolean condition = true;
if (condition) {
...
}
和
result = condition ? ...;
但是,區別在於條件運算符,條件表達式的類型是double
- 第二個操作數的類型是int
(由於強制轉換),第三個操作數的類型是double
。 條件運算符只能有一個類型,因此它遵循JLS中的規則並選擇double
(因為int
可以隱式轉換為double
但反之亦然)。 然后將該double
作為result
賦值的一部分(其類型為Object
)。 因此, result
的值最終成為對Double
的引用,並打印為2.0。
使用第一種方法,結果是Integer
,因為您將int
直接分配給result
,並且它只是自動進行了對比。
您可以通過將操作數強制轉換為Object
來使條件運算符的行為方式相同。 例如:
result = value == Math.floor(value) ? ((int) value) : (Object) value;
現在條件運算符本身的類型是Object
, int
作為評估條件運算符的一部分被裝箱到Integer
。
條件運算符的兩個可能值的類型?:
應該是相同的。 如果一個值的類型可以轉換為另一個值,則值有一點不同的空間。 在這種情況下,即使您將value
顯式轉換為int
,另一個值也是double
,因此會發生二進制數字提升,並將int
重新提升為double
。 這就是打印2.0
的原因。
JLS的第15.25節涵蓋了?:
運算符, 第15.25.2節涵蓋了該運算符的數值。
數字條件表達式的類型確定如下:
如果第二個和第三個操作數具有相同的類型,那么這就是條件表達式的類型。
如果第二個和第三個操作數之一是原始類型T,而另一個操作數的類型是對T應用裝箱轉換(第5.1.7節)的結果,那么條件表達式的類型是T.
如果其中一個操作數的類型為字節或字節,另一個操作數的類型為short或Short,則條件表達式的類型為short。
如果其中一個操作數是T類型,其中T是byte,short或char,另一個操作數是int類型的常量表達式(第15.28節),其值可以在類型T中表示,那么條件表達式的類型是T.
如果其中一個操作數是T類型,其中T是Byte,Short或Character,另一個操作數是int類型的常量表達式,其值可以在類型U中表示,這是將拆箱轉換應用於T的結果,那么條件表達式的類型是U.
否則,二進制數字提升(第5.6.2節)將應用於操作數類型,條件表達式的類型是第二個和第三個操作數的提升類型。
(強調我的)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.