2015-07-06 21 views
9

non riesco a capire come il codice qui sotto di stampa 50,0condizionale if-else in java

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

Dovrebbe stampare 50 (credo) Non 50.0

non è il codice di cui sopra è equivalente al codice sottostante ?,

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 
    } 
} 

Se sono equivalenti, allora perché la differenza di output?

+2

Perché non sono equivalenti. C'è un dupe da qualche parte. –

+0

@ Sotirious-Ma nella maggior parte dei libri, si dice che il 1 ° codice può essere pensato per un equivalente al 2 ° –

+3

@RajMalhotra si possono essere pensati come equivalenti; ma non sono identici ... è una semplificazione che viene usata per insegnare ai principianti, ma non è tutta la verità. –

risposta

9

Java garantire i tipi di sono coerenti, così nella prima istruzione

(x > 10) ? 50.0 : 50 

Hai una doppia prima, in modo che il tipo di ritorno dell'espressione è doppio, e l'int letterale viene convertita a raddoppiare. Quindi i due lati del condizionale sono gli stessi!

se si cambia a

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

Esso stampa 49.0.

se/else non è un'espressione, quindi non deve fare alcuna conversione.

5

Il tipo di operatore condizionale ternario - (x > 10) ? 50.0 : 50) è determinato dal 2 ° e dal 3 ° operando. Nel tuo caso, deve essere in grado di contenere i valori di entrambi 50.0 e 50, quindi il suo tipo è double.

Pertanto, anche quando l'espressione restituisce 50, viene eseguito il cast per il doppio e viene visualizzato 50.0.

Se si cambia

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

a

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

Vedrai 10.0 stampate, che renderà più evidente che il valore corretto (il lato destro del :) viene restituito.

+0

, capito, grazie –

+0

@raj Prego – Eran

6

Stampa 50.0 perché nel primo caso si chiama il metodo OutputStream.println(double), poiché la prima espressione restituisce un valore double indipendentemente dalla condizione.

Ma nel secondo caso si chiama il metodo OutputStream.println(int).