簡體   English   中英

Java:條件運算符與if / else不同

[英]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;

現在條件運算符本身的類型是Objectint作為評估條件運算符的一部分被裝箱到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM