Mieszanie danych wyjściowych w stylu C printf()(lub puts()lub putchar()...) z danymi std::cout << ...wyjściowymi w stylu C ++ może być niebezpieczne. Jeśli dobrze pamiętam, mogą mieć osobne mechanizmy buforowania, więc dane wyjściowe mogą nie pojawiać się w zamierzonej kolejności. (Jak wspomina AProgrammer w komentarzu, sync_with_stdiorozwiązuje ten problem).
printf()jest zasadniczo niebezpieczny dla typu. Typ oczekiwany dla argumentu jest określony przez ciąg formatu ( "%d"wymaga intpromowania lub czegoś, co promuje int, "%s"wymaga, char*który musi wskazywać na poprawnie zakończony ciąg w stylu C itp.), Ale przekazanie niewłaściwego typu argumentu powoduje niezdefiniowane zachowanie , nie jest to błąd diagnostyczny. Niektóre kompilatory, takie jak gcc, wykonują dość dobrą robotę, ostrzegając przed niedopasowaniem typów, ale mogą to zrobić tylko wtedy, gdy ciąg formatu jest literałem lub jest znany w czasie kompilacji (co jest najczęstszym przypadkiem) - i takie ostrzeżenia nie są wymagane przez język. Jeśli podasz niewłaściwy typ argumentu, mogą się zdarzyć dowolne złe rzeczy.
Z drugiej strony, strumień I / O C ++ jest znacznie bardziej bezpieczny dla typu, ponieważ <<operator jest przeciążony wieloma różnymi typami. std::cout << xnie musi określać typu x; kompilator wygeneruje odpowiedni kod dla dowolnego typu x.
Z drugiej strony printfopcje formatowania są znacznie wygodniejsze. Jeśli chcę wydrukować wartość zmiennoprzecinkową z 3 cyframi po przecinku, mogę użyć "%.3f"- i nie ma to wpływu na inne argumenty, nawet w ramach tego samego printfwywołania. setprecisionZ drugiej strony C ++ wpływa na stan strumienia i może zepsuć później dane wyjściowe, jeśli nie będziesz bardzo ostrożny, aby przywrócić strumień do poprzedniego stanu. (To moje osobiste wkurzenie; jeśli brakuje mi jakiegoś czystego sposobu, aby tego uniknąć, proszę o komentarz.)
Oba mają zalety i wady. Dostępność printfjest szczególnie przydatna, jeśli masz tło C i znasz go bardziej lub importujesz kod źródłowy C do programu C ++. std::cout << ...jest bardziej idiomatyczny dla C ++ i nie wymaga tyle uwagi, aby uniknąć niedopasowania typów. Oba są poprawnymi językami C ++ (standard C ++ obejmuje większość biblioteki standardowej C przez odniesienie).
To prawdopodobnie najlepiej użyć std::cout << ...dla dobra innych programistów C ++, który może pracować na kodzie, ale można użyć jednego albo - zwłaszcza w kodzie śledzenia, że masz zamiar wyrzucić.
Oczywiście warto poświęcić trochę czasu na naukę korzystania z debuggerów (ale w niektórych środowiskach może to nie być możliwe).
printfw świecie C ++? Coś tu brakuje?