Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Оператор вывода


Автор: pappyly 23.2.2011, 12:54
Всем привет, я только начал изучать С++, и столкнулся с оператором вывода, точнее с двумя:
printf и cout, в чем разница и какой лучше если есть разница...

Автор: Фантом 23.2.2011, 13:02
Первый - стандартная функция форматного вывода для C (имеющийся и в C++), второй - поток вывода для C++. В С++ идеологически правильнее, пожалуй, использовать cout, но можно и оба - как больше нравится.

Автор: KaraKum 23.2.2011, 13:13
Вдобавок к этому, printf() потоко-безопасная функция, а std::cout нет, например если из двух параллельно работающих потоков написать строки "помиловать" и "нельзя казнить" с помощью printf(), то гарантированно так и получится:
Цитата

помиловать
нельзя казнить

но если посредством std::cout, то может получиться, например, так:
Цитата

помиловать нельзя

казнить

потому что, в этом случае, пока выводилась первая строка ("помиловать"), то в это время втиснулась строка "нельзя казнить" между словом "помиловать" и символом конца строки, после чего дописался символ конца строки из "помиловать" (получилась пустая строка между ними) и дальше остатки строки "нельзя казнить".  smile 

Автор: pappyly 23.2.2011, 13:49
всем спасибо за понятные ответы, я все уяснил.

Автор: kemiisto 23.2.2011, 13:59
Цитата(KaraKum @  23.2.2011,  11:13 Найти цитируемый пост)
Вдобавок к этому, printf() потоко-безопасная функция, а std::cout нет

Во-первых, тут надо определить, что подразумевается под потоко-безопасностью.
Во-вторых, насколько я знаю, вы запостили откровенную чушь. Стандарт ни С, ни C++ не специфицируют потоко-безопасность этих функций (что бы вы под ней не понимали). Так что здесь классичсекий случай depends on implementation.

Автор: volatile 24.2.2011, 00:06
Цитата(KaraKum @  23.2.2011,  13:13 Найти цитируемый пост)
то может получиться, например, так:
помиловать нельзя

казнить

Это еще хорошо. Я когда баловался с выводом в cout с разных потоков получал что-то вроде:
Цитата

понельмилозя казватьнить
 smile 

Автор: alexvs11 24.2.2011, 00:15
Цитата(kemiisto @  23.2.2011,  13:59 Найти цитируемый пост)
Так что здесь классичсекий случай depends on implementation.

поэтому трассировки обычно делают в блокировках

потоки это хорошо, но printf/sprintf не заменят в случаях, когда это удобней потоковых вариантов (речь о std::cout, std::stringstream)
имхо манипуляторы не самая удобная вещь smile 
а вот файловые потоки c++ по сравнению с сишными FILE много удобнее

Добавлено через 1 минуту и 36 секунд
ну и да, это не операторы
первый функция, а второй глобальный объект std::ostream

Автор: mes 24.2.2011, 00:33
Цитата(alexvs11 @  23.2.2011,  23:15 Найти цитируемый пост)
но printf/sprintf не заменят в случаях, когда это удобней потоковых вариантов

во первых printf подходит только для плоских типов..  к тому же он потенциально опасен в С++-контексте.. 
во вторых для случаев когда требуется отформатировать по шаблону существует  другие инструменты, например 
http://www.boost.org/doc/libs/1_46_0/libs/format/index.html..

Добавлено через 3 минуты и 23 секунды
Цитата(alexvs11 @  23.2.2011,  23:15 Найти цитируемый пост)
 это не операторы

там не говорилось, что это операторы языка.. это не внутриязыковое понятие.. под "оператороми вывода" подразумеваются любые средства языка, непосредственно позволяющие этот вывод осуществить..

Автор: alexvs11 24.2.2011, 01:03
Цитата(mes @  24.2.2011,  00:33 Найти цитируемый пост)
во первых printf подходит только для плоских типов..

подразумевается поддержка operator<< и неявного приведения? в большинстве случаев их использование - сомнительный ход
Цитата(mes @  24.2.2011,  00:33 Найти цитируемый пост)
к тому же он потенциально опасен в С++-контексте.. 

существует синхронизация потоков стандартной библиотеки и ++ых потоков, ну и sscanf, sprintf разве чем-то опасны?

Цитата(mes @  24.2.2011,  00:33 Найти цитируемый пост)
во вторых для случаев когда требуется отформатировать по шаблону существует  другие инструменты, например boost.format..

буст хорошо, но внешняя зависимость же, не все воля программиста

Цитата(mes @  24.2.2011,  00:33 Найти цитируемый пост)
там не говорилось, что это операторы языка.. это не внутриязыковое понятие.. под "оператороми вывода" подразумеваются любые средства языка, непосредственно позволяющие этот вывод осуществить..

очень широкий взгляд на понятие оператора, как для программировании (операторы с точки зрения грамматики), так и для математики

Автор: mes 24.2.2011, 01:20
Цитата(alexvs11 @  24.2.2011,  00:03 Найти цитируемый пост)
очень широкий взгляд на понятие оператора, как для программировании (операторы с точки зрения грамматики), так и для математики 

изначально значение слова оператор было несколько другое... 
Цитата

Оператор – это элемент языка, который задает полное описание некоторого действия, которое необходимо выполнить. 
Оператор - это наиболее крупное и содержательное понятие языка: каждый оператор представляет собой законченную фразу языка программирования и определяет некоторый вполне законченный этап обработки данных. 
В состав операторов входят ключевые слова; данные; выражения и т.д.


Добавлено @ 01:30
Цитата(alexvs11 @  24.2.2011,  00:03 Найти цитируемый пост)
подразумевается поддержка operator<< и неявного приведения?

smile
Цитата(alexvs11 @  24.2.2011,  00:03 Найти цитируемый пост)
существует синхронизация потоков стандартной библиотеки и ++ых потоков,

при чем тут это ?  smile 

имелась ввиду "неадекватность" применения эллипсисных функций к объектам С++.

Автор: pappyly 24.2.2011, 14:24
Народ, народ вы слегка оторвались от темы, и не забывайте вы все это объясняете мне - новичку, которому не очень понятны ваши заумные фразы, я ведь только начал изучать язык; пожалуйста можно как-нибудь по проще?

Автор: kemiisto 24.2.2011, 14:31
Использую std::cout.

Автор: Modul 24.2.2011, 14:51
Код

#include <iostream>

int main()
{
    std::cout << "Hello world !" << std::endl;
    return 0;
}


Автор: mes 24.2.2011, 15:50
printf и компания - подходят только для простых стандартных типов и нужны фактически только при программировании в с-стиле..




Автор: Modul 24.2.2011, 17:04
Дядьки в своих материях ...

Ну как ? Получилось ?

Автор: alexvs11 24.2.2011, 20:41
Цитата(mes @  24.2.2011,  15:50 Найти цитируемый пост)
подходят только для простых стандартных типов и нужны фактически только при программировании в с-стиле..

пример в котором действительно прям требуется применение потоков?

Автор: mes 24.2.2011, 21:05
Цитата(alexvs11 @  24.2.2011,  19:41 Найти цитируемый пост)
пример в котором действительно прям требуется применение потоков? 

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

Автор: alexvs11 24.2.2011, 22:52
опасность обвала стека это понятно (причем на разных компьютерах еще может иметь и разное поведения), но вот где потоки принципиально удобней использовать сишных функций вывода? чтото не представляется такого

Автор: pappyly 24.2.2011, 23:24
да спасибо Modul, кстати я тоже компилирую в microsoft visual c++, и обязательно писать return 0?

Автор: bsa 26.2.2011, 19:43
Цитата(pappyly @  24.2.2011,  23:24 Найти цитируемый пост)
да спасибо Modul, кстати я тоже компилирую в microsoft visual c++, и обязательно писать return 0?
Примерно так же, как надевать штаны перед выходом на улицу. Можно, конечно, и не надевать... Мне лично не лень написать "лишних" 9 символов, так как после этого ни у кого не возникнет вопросов, что же возвращает обычно main().

Автор: alexvs11 26.2.2011, 20:01
по стандарту необязательно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)