A mistura de saída no estilo C printf()(ou puts()ou putchar()ou ...) com saída no estilo C ++ std::cout << ...pode não ser segura. Se bem me lembro, eles podem ter mecanismos de buffer separados, portanto a saída pode não aparecer na ordem desejada. (Como o AProgrammer menciona em um comentário, sync_with_stdiotrata disso).
printf()é fundamentalmente inseguro. O tipo esperado para um argumento é determinado pela sequência de caracteres de formato ( "%d"requer um intou algo que promova int, "%s"requer um char*que deve apontar para uma sequência de estilo C terminada corretamente etc.), mas passar o tipo errado de argumento resulta em comportamento indefinido , não é um erro diagnosticável. Alguns compiladores, como o gcc, fazem um trabalho razoavelmente bom de aviso sobre incompatibilidades de tipo, mas podem fazê-lo apenas se a sequência de formatação for literal ou for conhecida em tempo de compilação (que é o caso mais comum) - e avisos não são exigidos pelo idioma. Se você passar o tipo errado de argumento, coisas arbitrariamente ruins podem acontecer.
A E / S de fluxo do C ++, por outro lado, é muito mais segura quanto ao tipo, pois o <<operador está sobrecarregado para muitos tipos diferentes. std::cout << xnão precisa especificar o tipo de x; o compilador irá gerar o código certo para qualquer tipo x.
Por outro lado, printfas opções de formatação são muito mais convenientes. Se eu quiser imprimir um valor de ponto flutuante com 3 dígitos após o ponto decimal, posso usar "%.3f"- e isso não afeta outros argumentos, mesmo dentro da mesma printfchamada. Os C ++ setprecision, por outro lado, afetam o estado do fluxo e podem atrapalhar a saída posterior, se você não tomar muito cuidado para restaurar o fluxo ao estado anterior. (Esta é minha irritação pessoal; se estiver faltando alguma maneira limpa de evitá-la, comente.)
Ambos têm vantagens e desvantagens. A disponibilidade de printfé particularmente útil se você tiver um plano de fundo em C e estiver mais familiarizado com ele, ou se estiver importando o código-fonte em um programa em C ++. std::cout << ...é mais idiomático para C ++ e não requer muito cuidado para evitar incompatibilidades de tipo. Ambos são C ++ válidos (o padrão C ++ inclui a maior parte da biblioteca padrão C por referência).
É provavelmente melhor usar std::cout << ...para o bem de outros programadores C ++ que podem trabalhar em seu código, mas você pode usar qualquer um - especialmente no código de rastreamento que você vai jogar fora.
E é claro que vale a pena gastar algum tempo aprendendo a usar depuradores (mas isso pode não ser viável em alguns ambientes).
printfno mundo C ++? Estou faltando alguma coisa aqui?