La miscelazione di output in stile C printf()(o puts()o putchar()o ...) con std::cout << ...output in stile C ++ può non essere sicura. Se ricordo bene, possono avere meccanismi di buffering separati, quindi l'output potrebbe non apparire nell'ordine previsto. (Come menziona AProgrammer in un commento, si sync_with_stdiorivolge a questo).
printf()è fondamentalmente non sicuro. Il tipo previsto per un argomento è determinato dalla stringa di formato ( "%d"richiede uno into qualcosa che promuove int, "%s"richiede uno char*che deve puntare a una stringa di tipo C terminata correttamente, ecc.), Ma il passaggio di un tipo di argomento errato provoca un comportamento indefinito , non un errore diagnosticabile. Alcuni compilatori, come gcc, fanno un buon lavoro di avvertimento sui disallineamenti dei tipi, ma possono farlo solo se la stringa di formato è letterale o è altrimenti nota al momento della compilazione (che è il caso più comune) - e simili gli avvisi non sono richiesti dalla lingua. Se passi il tipo di argomento sbagliato, possono accadere cose arbitrariamente cattive.
L'I / O stream di C ++, d'altra parte, è molto più sicuro, poiché l' <<operatore è sovraccarico per molti tipi diversi. std::cout << xnon è necessario specificare il tipo di x; il compilatore genererà il codice giusto per qualunque tipo xabbia.
D'altra parte, printfle opzioni di formattazione sono IMHO molto più convenienti. Se voglio stampare un valore in 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 printfchiamata. Il C ++ setprecision, d'altra parte, influenza lo stato del flusso e può rovinare l'output successivo se non stai molto attento a ripristinare il flusso al suo stato precedente. (Questa è la mia pipì personale per animali domestici; se mi manca un modo pulito per evitarlo, si prega di commentare.)
Entrambi hanno vantaggi e svantaggi. La disponibilità di printfè particolarmente utile se ti capita di avere uno sfondo C e ne hai più familiarità o se stai importando il codice sorgente C in un programma C ++. std::cout << ...è più idiomatico per C ++ e non richiede troppe cure per evitare discrepanze tra i tipi. Entrambi sono C ++ validi (lo standard C ++ include la maggior parte della libreria standard C per riferimento).
E ' probabilmente meglio usare std::cout << ...per il bene di altri programmatori C ++ che possono lavorare sul vostro codice, ma è possibile utilizzare uno dei due - in particolare nel codice di traccia che si sta andando a buttare via.
E ovviamente vale la pena dedicare un po 'di tempo ad imparare come usare i debugger (ma ciò potrebbe non essere fattibile in alcuni ambienti).
printfnel mondo C ++? Mi manca qualcosa qui?