На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> cout и printf , в чем разница?
    Я вот си++ только еще изучаю и у меня есть вопросик :)
    В чем разница между printf из stdio.h и cout из iostream.h?
    Если выводить текст, то одно и тоже:
    ExpandedWrap disabled
      printf("Hello, World\n");

    и
    ExpandedWrap disabled
      cout<<"Hello, World!\n";

    Так в чем разница?
      А разница большая... Cout это потоковый вывод, а printf - это функция с переменным количеством параметров. У неё основное отличие (на твоём уровне) - это наличие у функции printf управляющей строки, при помощи которой выполняются спецификации преобразования! Ну это только самая самая верхушка айсберга!
      Сообщение отредактировано: _HuGo_ -
        В основном, разница в синтаксисе.
        Но при работе по найму наверняка будут требовать использования cout, хотя для форматного вывода это менее удобно.
          Это я тоже понимаю, что cout потоковый.
          А со стороны пользователя, который запускает эту прогу, разница в чем?
            Для пользователя разницы никакой. Для него нет способа даже узнать, какой вариант использован в программе..
              Есть разница для тебя, как программиста... Например, у тебя стоит ограничение на вывод вещественного числа. Тебе требуется вывести число и два знака после запятой. Для функции printf это выглядит так printf("%7.2f",a) , где 7.2 означает, что число не длиннее 7 знаков, и два после запятой. С cout ты так просто не отделаешься...
                А еще отличие в том, что можно выводить пользовательские типы! Т.е. ты написал свой класс, перегрузил operator<< и можешь выводить свой тип как cout << объект_моего_класса . Очень удобно и полезно!
                  Теперь понял немного :)
                    Цитата
                    _HuGo_, 25.04.04, 08:17
                    А разница большая... Cout это потоковый вывод, а printf - это функция с переменным количеством параметров.

                    Ну, формально говоря, и то, и другое - это потоковый вывод :). Непотоковый - это напрямую с помощью методов open/read/write и т. п. Но это уже тонкости.
                    В свое время про различие между сout и printf мне сказали следующее - "с помощью printf нельзя сделать чего-то такого, что невозможно сделать с помощью cout". Т. е. функциональность у них одна, различаются только способы доступа к ней. Например, следующие записи эквивалентны:
                    ExpandedWrap disabled
                       
                      printf("%7.3f", 0.15);
                      std::cout << std::setw(7) << std::setprecision(3) << 0.15 << std::endl;

                    Вообще говоря, в C++ рекомендуется пользоваться C++-потоками. Они типобезопасны, и по функционалу не уступают C-шным. Так что...
                    Сообщение отредактировано: Flex Ferrum -
                      ..У меня такое подозрение, что приведенный выше пример как раз и демонстрирует небезопасность printf, так как константа типа double и по идее не должна корректно выводиться по спецификатору %f.

                      С другой стороны, формат в printf задается более наглядно, и в целом этот способ, на мой взгляд, удобнее, так как ошибки несоответствия типа в printf, хоть и неизбежны, но очень легко обнаруживаются и исправляются..

                      Кстати, это может даже хорошо, если изначально в программе ошибок не слишком мало - это создаст спортивный интерес тестировщикам, которые в противном случае просто заснут и пропустят редкие ошибки.
                        Цитата
                        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
                        Кстати, это может даже хорошо, если изначально в программе ошибок не слишком мало - это создаст спортивный интерес тестировщикам, которые в противном случае просто заснут и пропустят редкие ошибки.

                        Ага. Если тестеры наличиствуют. А в противном случае - это гемор для программиста.
                        Сообщение отредактировано: Flex Ferrum -
                          Цитата Flex Ferrum @ 25.04.04, 14:06
                          Да будет тебе известно, что при передачи float-параметров в функции с переменным количеством аргументов, производится их продвижение до типа double.

                          Да уж.. теперь будет известно.. если сумею поверить в такое (!).
                          ..Иногда возникает ощущение, что разработчики языков специально включают фичи, которые на трезвую голову не вообразить, чтобы запутать..

                          Цитата
                          Как сказать. Можешь ты на вскидку (не смотря в хелп) сказать - что означают числа 7 и 3 в спецификаторе %7.3f? А вот в случае с потоками - все ясно без лишних комменатриев.

                          Имя setw тоже мало о чем говорит..
                            Цитата
                            nvm, 25.04.04, 17:30
                            Да уж.. теперь будет известно.. если сумею поверить в такое (!).
                            ..Иногда возникает ощущение, что разработчики языков специально включают фичи, которые на трезвую голову не вообразить, чтобы запутать..

                            Ну почему же? Все специфицировано и вполне логично. Все целые (меньшие по размеру) продвигаются до int, все плавающие (:) ) - до double. Все правильно. Что тут запутанного? Наоборот - достигается некоторая унификация.
                              Цитата Flex Ferrum @ 25.04.04, 14:42
                              Ну почему же? Все специфицировано и вполне логично. Все целые (меньшие по размеру) продвигаются до int, все плавающие (:) ) - до double. Все правильно. Что тут запутанного? Наоборот - достигается некоторая унификация.

                              ..Не то чтобы сильно логично - скорее, уступка для удобства технической реализации.
                              Но, пожалуй, не так и дико, как кажется на первый взгляд: раз конкретного шаблона нет, то почему бы не поделать неявных кастов.

                              Спасибо за интересную информацию.
                              ..Сколько использую С - ни разу с этим не столкнулся. Видимо, потому что не использую функции с переменным числом параметров, так как в С++ они не нужны.
                              А при использовании printf этого можно не заметить, так как ошибкам в нем незнание этого факта не приводит.
                              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0368 ]   [ 15 queries used ]   [ Generated: 10.07.25, 13:22 GMT ]