2011-12-25 5 views
29

Nel seguente programmaformattazione utilizzando printf e il formato

class ZiggyTest2 { 

    public static void main(String[] args){  

     double x = 123.456; 
     char c = 65; 
     int i = 65; 

     System.out.printf("%s",x); 
     System.out.printf("%b",x); 
     System.out.printf("%c",c); 
     System.out.printf("%5.0f",x); 
     System.out.printf("%d",i); 
    }  
} 

L'uscita è

123.456trueA 12365 

Qualcuno può spiegare come un valore doppio (cioè 123.456) viene convertito in un valore booleano (es. true)

Il motivo che mi chiedo è perché so Java non consente numeri da utilizzare per i valori booleani. Ad esempio, il seguente non è consentito in Java

if (5) { 
//do something 
} 

Grazie

+0

penso che sia bello far notare che v'è una differenza importante tra l'uso di booleani in 'if' dichiarazioni contro in' printf'. Cioè, una dichiarazione 'if' richiede un boolean' primitiva' (o un oggetto 'boolean', che sarà unboxed). Quindi qualsiasi valore non booleano non è permesso. Tuttavia, 'printf' richiede che i suoi argomenti siano di tipo' Object', cioè qualsiasi tipo. Così, il compilatore non pone alcuna restrizione le argomentazioni a 'printf': anche se sono tipi primitivi come' boolean', possono essere inscatolati (a 'boolean'). Questo è il motivo per cui puoi passare tipi inaspettati a 'printf' ma non a' if'. –

risposta

96

per "% b": Se l'argomento arg è nullo, quindi il risultato è "falso". Se arg è booleano o booleano, il risultato è la stringa restituita da String.valueOf(). Altrimenti, il risultato è "vero".

reference

+4

Sì, quindi se siete C sviluppatore, stare attenti, perché String.Format ("% b", 0) e String.Format ("% b", 1) saranno entrambi di ritorno "vero" –

0

Poiché il valore è di tipo double e questo è come il convertitore %b lavora con valori di questo tipo.

10

La API documentation sembra indicare chiaramente il motivo.

Se l'argomento arg è nullo, il risultato è "falso". Se arg è un valore booleano o booleano, allora il risultato è la stringa restituita da String.valueOf(). Altrimenti, il risultato è "vero".