Miscelare output C-style printf()
(o puts()
o putchar()
o ...) con C ++ - lo stile std::cout << ...
output può essere pericoloso. Se ricordo correttamente, possono avere meccanismi di buffering separati, quindi l'output potrebbe non apparire nell'ordine previsto. (Come menzionato da AProgrammer in un commento, sync_with_stdio
risolve questo problema.
printf()
è fondamentalmente di tipo non sicuro. Il tipo previsto per un argomento è determinato dalla stringa di formato ( "%d"
richiede int
o qualcosa che promuove a int
, "%s"
richiede un char*
che deve puntare a una stringa in stile C terminata correttamente, ecc.), ma il passaggio del tipo errato di argomento comporta un comportamento indefinito, non un errore diagnosticabile. Alcuni compilatori, come gcc, fanno un buon lavoro di avvertimento sulle mancate corrispondenze di tipo, ma possono farlo solo se la stringa di formato è letterale o è altrimenti nota al momento della compilazione (che è il caso più comune) - e tale gli avvertimenti non sono richiesti dalla lingua Se passi il tipo di argomento sbagliato, possono accadere cose arbitrarie.
L'I / O del flusso di C ++, d'altra parte, è molto più sicuro dal punto di vista dei caratteri, poiché l'operatore <<
è sovraccarico per molti tipi diversi. std::cout << x
non deve specificare il tipo di x
; il compilatore genererà il codice giusto per qualsiasi tipo di x
.
D'altra parte, le opzioni di formattazione di printf
sono IMHO molto più convenienti. Se voglio stampare un valore a virgola mobile con 3 cifre dopo il punto decimale, posso usare "%.3f"
- e non ha alcun effetto su altri argomenti, anche all'interno della stessa chiamata printf
. Il setprecision
di C ++, d'altra parte, influenza lo stato del flusso e può rovinare l'output successivo se non si presta molta attenzione a ripristinare il flusso al suo stato precedente. (Questo è il mio cruccio personale, se mi manca un modo pulito per evitarlo, per favore commenta.)
Entrambi hanno vantaggi e svantaggi. La disponibilità di printf
è particolarmente utile se hai uno sfondo C e se hai più familiarità con esso, o se stai importando il codice sorgente C in un programma C ++. std::cout << ...
è più idiomatico per C ++ e non richiede la stessa attenzione per evitare errori di tipo. Entrambi sono C ++ validi (lo standard C ++ include la maggior parte della libreria standard C per riferimento).
È probabilmente meglio usare std::cout << ...
per il piacere di altri programmatori C ++ che potrebbero lavorare sul tuo codice, ma puoi usarne uno - specialmente nel codice di traccia che stai per buttare via.
Ovviamente vale la pena dedicare un po 'di tempo a imparare a usare i debugger (ma potrebbe non essere fattibile in alcuni ambienti).