Смешивание вывода в стиле C printf()(или puts()или putchar()или ...) с выводом в стиле C ++ std::cout << ...может быть небезопасным. Если я правильно помню, у них могут быть отдельные механизмы буферизации, поэтому выходные данные могут не отображаться в намеченном порядке. (Как AProgrammer упоминает в комментарии, sync_with_stdioобращается к этому).
printf()принципиально небезопасен. Тип, ожидаемый для аргумента, определяется форматной строкой ( "%d"требуется символ intили что-то, что повышается int, "%s"требуется элемент, char*который должен указывать на правильно завершенную строку в стиле C и т. Д.), Но передача неверного типа аргумента приводит к неопределенному поведению , не диагностируемая ошибка. Некоторые компиляторы, такие как gcc, достаточно хорошо предупреждают о несоответствиях типов, но они могут делать это только в том случае, если строка формата является литералом или иным образом известна во время компиляции (что является наиболее распространенным случаем) - и так далее. предупреждения не требуются языком. Если вы передадите неправильный тип аргумента, может произойти сколь угодно плохое.
С другой стороны, потоковый ввод / вывод в C ++ намного более безопасен для типов, поскольку <<оператор перегружен для множества различных типов. std::cout << xне нужно указывать тип x; компилятор сгенерирует правильный код для любого типа x.
С другой стороны, printfпараметры форматирования ИМХО гораздо удобнее. Если я хочу напечатать значение с плавающей точкой с 3 цифрами после десятичной точки, я могу использовать "%.3f"- и это не влияет на другие аргументы, даже в пределах того же самого printfвызова. С ++ setprecision, с другой стороны, влияет на состояние потока и может испортить последующий вывод, если вы не очень осторожны, чтобы вернуть поток в его предыдущее состояние. (Это моя личная любимая мозоль; если мне не хватает какого-то чистого способа избежать этого, пожалуйста, прокомментируйте.)
Оба имеют свои преимущества и недостатки. Доступность printfособенно полезна, если у вас есть фон C и вы с ним более знакомы, или если вы импортируете исходный код C в программу C ++. std::cout << ...более идиоматичен для C ++ и не требует особого внимания, чтобы избежать несоответствия типов. Оба являются действительными C ++ (стандарт C ++ включает в себя большую часть стандартной библиотеки C по ссылке).
Вероятно, это лучше всего использовать std::cout << ...ради других программистов C ++, которые могут работать над вашим кодом, но вы можете использовать любой из них - особенно в коде трассировки, который вы собираетесь выбросить.
И, конечно, стоит потратить некоторое время на изучение того, как использовать отладчики (но в некоторых средах это может оказаться невозможным).
printfв мире C ++? Я что-то здесь упускаю?