federico992 ha scritto:
Però si fa brutta figura se si usa printf?
No affatto! perché dovrebbe?
federico992 ha scritto:
Su un post ho visto che molti hanno storto il naso di fronte a printf.
Il printf del linguaggio "C" è parecchio limitato e pure "fragile", perché il runtime non può fare controlli sulla correttezza dei valori rispetto agli specificatori di formato.
Se in "C" fai
int v = 1000;
printf("%s\n", v);
Il runtime non può sapere se quello che hai passato è davvero un puntatore ad una stringa oppure no. In ambiente 32 bit un puntatore ha la stessa dimensione (in bit) di un int. Un compilatore un po' sveglio potrebbe fare dei controlli ed emettere un warning ma quel codice gira tranquillamente. Solo che è altamente probabile, quasi certo, che quel codice mandi in crash la applicazione con il classico
segmentation fault.
In Java la formattazione con printf/format è estremamente più robusta. Quelli che vengono passati sono oggetti e oltretutto in un array, quindi verificabile come lunghezza.
Il motore della formattazione è in grado di fare tutta una serie di controlli tra gli specificatori di formato e gli oggetti passati. Se c'è qualcosa che non quadra viene lanciata una eccezione unchecked (una delle varie sotto-classi di java.util.IllegalFormatException).
Inoltre la formattazione di Java è in grado di:
- gestire date/ore
- gestire la localizzazione di numeri/date con un Locale esplicito o quello predefinito.
- gestire la specifica di indici negli specificatori es. %
3$s per indirizzare in modo differente gli argomenti
queste tre cose più svariate altre riguardo specificatori, flag, ecc... sono tutte cose che il printf del C semplicemente NON ha e se le può tranquillamente sognare. In definitiva: tra il printf del C e i printf/format di Java c'è praticamente un abisso.