2017-02-28 50 views
0

我最近遇到了第一個syso()charcter工作正常但在第二個syso()中打印ASCII代碼的場景。int和char操作數的三元表達式的類型是什麼?

public class Test{ 
public static void main(String[] args) { 
    char x = 'A'; 
    char y= 'B'; 
    int m = 0; 

    System.out.println(true ? x : 0);//Working fine prints A 
    System.out.println(true ? y : 0);//Working fine prints B 
    System.out.println(false ? 0 : y);//Working fine prints B 
    System.out.println(false ? m : x);// Here it prints 65 why ? 
    } 
} 

我真的想知道爲什麼它在第二個syso()打印ascii代碼?請幫忙

+0

我剛剛編輯了我的代碼,並將0放在前面,但答案又與我們的假設相矛盾。 –

+1

@Sotirios Doh。我坐在這裏看着JLS,而不是找傻瓜。 –

回答

2

問題在於false ? m : x的類型,它最終是int而不是char

作爲每JLS section 15.25.2(加重和[]注礦):

類型數值條件表達式確定爲如下:

  • 如果第二和第三個操作數具有相同類型的,那麼這就是條件表達式的類型。

...

  • 否則[如果沒有上述規則HOLD],二進制數值提升(§5.6.2)被施加到操作數類型,以及條件表達式的類型是第二個和第三個操作數的提升類型。

binary numeric promotion's relevant rule is(重點煤礦):

加寬原語轉換(§5.1.2)被施加到轉換的任一個或由下面的規則中指定的兩個操作數:

  • 如果其中一個操作數是double類型,另一個則轉換爲double。

  • 否則,如果任一操作數的類型爲float,則另一個操作數轉換爲float。

  • 否則,如果任一操作數的類型爲long,則另一個操作數轉換爲long。

  • 否則,兩個操作數都轉換爲int類型。

因此在:

char x = ...; 
int m = ...; 

表達condition ? m : x被提升爲int,和System.out.println(int)被調用,並且它打印它作爲一個數字。

您必須明確地將m或整個表達式轉換爲char,例如,:

System.out.println((char)(false ? m : x)); 

或者:

System.out.println(false ? (char)m : x); 

至於從15.25.2您condition ? x : 0condition ? 0 : x形式的規則之一(我上面略)是:

  • 如果其中一個操作數的類型是T,其中T是字節,short或char,另一個操作數是int類型的常量表達式(第15.28節),其值可以用類型表示T,則條件表達式的類型爲T.

0符合此描述。 xchar,0適合於char,因此條件的類型是char並且字符被打印。

+0

爲什麼它不工作,一旦我們有0盈方而不是m –

+0

@ShowStopper看到我的編輯,答案的結束。 –

相關問題