Змішування виходу в стилі С 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параметри форматування IMHO набагато зручніші. Якщо я хочу надрукувати значення з плаваючою комою з 3 цифрами після десяткової крапки, я можу використовувати "%.3f"- і це не впливає на інші аргументи, навіть у межах одного printfдзвінка. З setprecisionіншого боку, C ++ впливає на стан потоку і може зіпсувати пізніший результат, якщо ви не дуже обережні відновити потік до його попереднього стану. (Це мій особистий вихованець, якщо я пропускаю чистий спосіб уникнути цього, будь ласка, прокоментуйте.)
Обидва мають переваги та недоліки. Наявність printfособливо корисного, якщо у вас є C-фон і ви з ним більше знайомі, або якщо ви імпортуєте вихідний код C в програму C ++. std::cout << ...є більш ідіоматичним для C ++ і не потребує такої обережності, щоб уникнути невідповідностей типів. Обидва є дійсними C ++ (стандарт C ++ включає більшість стандартних бібліотек C за посиланням).
Це, мабуть, найкраще використовувати std::cout << ...заради інших програмістів на C ++, які можуть працювати над вашим кодом, але ви можете використовувати будь-який, особливо в трассинговому коді, який ви збираєтеся викинути.
І звичайно, варто витратити трохи часу на те, як використовувати налагоджувачі (але це може бути неможливо в деяких умовах).
printfу світі С ++? Я щось тут пропускаю?