2015-07-06 21 views
9

Jestem w stanie zrozumieć, jak poniższy kod druku 50,0warunkowa if-else w java

public class Pre 
{ 
    public static void main(String[] args) 
    { 
     int x=10; 
     System.out.println((x > 10) ? 50.0 : 50); //output 50.0 
    } 
} 

Należy wydrukować 50 (chyba) nie 50,0

nie Czy powyższy kod jest równoważne poniżej kodu ?,

public class Pre 
{ 
    public static void main(String[] args) 
    { 
     int x=10; 
     if(x>10) 
      System.out.println(50.0); 
     else 
      System.out.println(50);//output 
    } 
} 

Jeśli są one równoważne, to dlaczego różnica w produkcji?

+2

Ponieważ nie są one równoważne. Gdzieś tam jest dupek. –

+0

@ Sotirious-Ale w większości książek wspomina się, że pierwszy kod może być uznany za równoważny z drugim –

+3

@RajMalhotra tak, że można je uważać za równoważny; ale nie są one identyczne ... to jest uproszczenie, które jest używane do nauczania początkujących, ale to nie jest cała prawda. –

Odpowiedz

9

Java zapewnić wasze typy są spójne, a więc w pierwszym piśmie

(x > 10) ? 50.0 : 50 

Masz podwójne pierwszy, więc zwracany typ wyrażenia jest podwójne, a litteral int przekształca się podwoić. W związku z tym obie strony warunkowego są takie same!

Jeśli go zmienić na

System.out.println((x > 10) ? 50.0 : 49); 

Drukuje 49.0.

if/else nie jest wyrażeniem, dlatego nie musi wykonywać żadnej konwersji.

5

Typ trójskładnikowego operatora warunkowego - (x > 10) ? 50.0 : 50) jest określany zarówno przez drugi, jak i trzeci operand. W twoim przypadku musi być w stanie zawierać wartości zarówno 50.0, jak i 50, więc jego typ to double.

Dlatego też, nawet jeśli wyrażenie zwraca 50, jest ono rzutowane na podwójne i pojawia się 50.0.

Jeżeli zmienisz

System.out.println((x > 10) ? 50.0 : 50); 

do

System.out.println((x > 10) ? 50.0 : 10); 

Zobaczysz 10.0 drukowane, które sprawiają, że oczywiste, że prawidłowa wartość (prawa strona :) jest zwracana.

+0

, dostałem go, dzięki –

+0

@raj Nie ma za co – Eran

6

Drukuje 50.0, ponieważ w pierwszym przypadku wywołuje się metodę OutputStream.println(double), ponieważ pierwsze wyrażenie zwraca wartość double niezależnie od stanu.

Ale w drugim przypadku wywołuje się metodę OutputStream.println(int).