
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.76] |
![]() |
|
Сообщ.
#1
,
|
|
|
Я вот си++ только еще изучаю и у меня есть вопросик
![]() В чем разница между printf из stdio.h и cout из iostream.h? Если выводить текст, то одно и тоже: ![]() ![]() printf("Hello, World\n"); и ![]() ![]() cout<<"Hello, World!\n"; Так в чем разница? |
Сообщ.
#2
,
|
|
|
А разница большая... Cout это потоковый вывод, а printf - это функция с переменным количеством параметров. У неё основное отличие (на твоём уровне) - это наличие у функции printf управляющей строки, при помощи которой выполняются спецификации преобразования! Ну это только самая самая верхушка айсберга!
|
Сообщ.
#3
,
|
|
|
В основном, разница в синтаксисе.
Но при работе по найму наверняка будут требовать использования cout, хотя для форматного вывода это менее удобно. |
Сообщ.
#4
,
|
|
|
Это я тоже понимаю, что cout потоковый.
А со стороны пользователя, который запускает эту прогу, разница в чем? |
Сообщ.
#5
,
|
|
|
Для пользователя разницы никакой. Для него нет способа даже узнать, какой вариант использован в программе..
|
Сообщ.
#6
,
|
|
|
Есть разница для тебя, как программиста... Например, у тебя стоит ограничение на вывод вещественного числа. Тебе требуется вывести число и два знака после запятой. Для функции printf это выглядит так printf("%7.2f",a) , где 7.2 означает, что число не длиннее 7 знаков, и два после запятой. С cout ты так просто не отделаешься...
|
Сообщ.
#7
,
|
|
|
А еще отличие в том, что можно выводить пользовательские типы! Т.е. ты написал свой класс, перегрузил operator<< и можешь выводить свой тип как cout << объект_моего_класса . Очень удобно и полезно!
|
Сообщ.
#8
,
|
|
|
Теперь понял немного
![]() |
Сообщ.
#9
,
|
|
|
Цитата _HuGo_, 25.04.04, 08:17 А разница большая... Cout это потоковый вывод, а printf - это функция с переменным количеством параметров. Ну, формально говоря, и то, и другое - это потоковый вывод ![]() В свое время про различие между сout и printf мне сказали следующее - "с помощью printf нельзя сделать чего-то такого, что невозможно сделать с помощью cout". Т. е. функциональность у них одна, различаются только способы доступа к ней. Например, следующие записи эквивалентны: ![]() ![]() printf("%7.3f", 0.15); std::cout << std::setw(7) << std::setprecision(3) << 0.15 << std::endl; Вообще говоря, в C++ рекомендуется пользоваться C++-потоками. Они типобезопасны, и по функционалу не уступают C-шным. Так что... |
Сообщ.
#10
,
|
|
|
..У меня такое подозрение, что приведенный выше пример как раз и демонстрирует небезопасность printf, так как константа типа double и по идее не должна корректно выводиться по спецификатору %f.
С другой стороны, формат в printf задается более наглядно, и в целом этот способ, на мой взгляд, удобнее, так как ошибки несоответствия типа в printf, хоть и неизбежны, но очень легко обнаруживаются и исправляются.. Кстати, это может даже хорошо, если изначально в программе ошибок не слишком мало - это создаст спортивный интерес тестировщикам, которые в противном случае просто заснут и пропустят редкие ошибки. |
Сообщ.
#11
,
|
|
|
Цитата nvm, 25.04.04, 16:34 ..У меня такое подозрение, что приведенный выше пример как раз и демонстрирует небезопасность printf, так как константа типа double и по идее не должна корректно выводиться по спецификатору %f. Да будет тебе известно, что при передачи float-параметров в функции с переменным количеством аргументов, производится их продвижение до типа double. Форматные спецификаторы f, e и g определяют лишь способ вывода числа с плавающей точкой (fixed, engeneer или general). Цитата nvm, 25.04.04, 16:34 С другой стороны, формат в printf задается более наглядно, и в целом этот способ, на мой взгляд, удобнее, так как ошибки несоответствия типа в printf, хоть и неизбежны, но очень легко обнаруживаются и исправляются.. Как сказать. Можешь ты на вскидку (не смотря в хелп) сказать - что означают числа 7 и 3 в спецификаторе %7.3f? А вот в случае с потоками - все ясно без лишних комменатриев. Цитата nvm, 25.04.04, 16:34 Кстати, это может даже хорошо, если изначально в программе ошибок не слишком мало - это создаст спортивный интерес тестировщикам, которые в противном случае просто заснут и пропустят редкие ошибки. Ага. Если тестеры наличиствуют. А в противном случае - это гемор для программиста. |
Сообщ.
#12
,
|
|
|
Цитата Flex Ferrum @ 25.04.04, 14:06 Да будет тебе известно, что при передачи float-параметров в функции с переменным количеством аргументов, производится их продвижение до типа double. Да уж.. теперь будет известно.. если сумею поверить в такое (!). ..Иногда возникает ощущение, что разработчики языков специально включают фичи, которые на трезвую голову не вообразить, чтобы запутать.. Цитата Как сказать. Можешь ты на вскидку (не смотря в хелп) сказать - что означают числа 7 и 3 в спецификаторе %7.3f? А вот в случае с потоками - все ясно без лишних комменатриев. Имя setw тоже мало о чем говорит.. |
Сообщ.
#13
,
|
|
|
Цитата nvm, 25.04.04, 17:30 Да уж.. теперь будет известно.. если сумею поверить в такое (!). ..Иногда возникает ощущение, что разработчики языков специально включают фичи, которые на трезвую голову не вообразить, чтобы запутать.. Ну почему же? Все специфицировано и вполне логично. Все целые (меньшие по размеру) продвигаются до int, все плавающие ( ![]() |
Сообщ.
#14
,
|
|
|
Цитата Flex Ferrum @ 25.04.04, 14:42 Ну почему же? Все специфицировано и вполне логично. Все целые (меньшие по размеру) продвигаются до int, все плавающие ( ![]() ..Не то чтобы сильно логично - скорее, уступка для удобства технической реализации. Но, пожалуй, не так и дико, как кажется на первый взгляд: раз конкретного шаблона нет, то почему бы не поделать неявных кастов. Спасибо за интересную информацию. ..Сколько использую С - ни разу с этим не столкнулся. Видимо, потому что не использую функции с переменным числом параметров, так как в С++ они не нужны. А при использовании printf этого можно не заметить, так как ошибкам в нем незнание этого факта не приводит. |