printf или cout

printf
6
Нейтральная
сторона
2
cout
4
unix-way
Прежде чем писать комментарии или выбрать сторону вы должны авторизироваться!
OOP

06-11-2012 23:47 +1

Заголовки уж больно короткие. Можно было бы и развернуть, чтобы всем было ясно, о чём спор. Был у нас холивар Объектно-ориентированное vs Процедурное, был unix-way vs windows-way (но здесь явно не этот спор), было несколько типа «Си vs С++».

Всё-таки о чём спор: об объектно-ориентированном программировании, о языках, о библиотеках?

0 комментариев
07-11-2012 00:02 0

имеется в виду то, чем лучше выводить текст в консоль\терминал

4 комментария
opera.rulez 07-11-2012 00:12 0

MrGeneroth, На всякий случай: под аргументом есть кнопка «Ответить на аргумент».

По теме холивара: это про bash (я с ним плохо знаком, поэтому не в курсе, есть ли там cout) или про написание консольных программ на C/C++?

MrGeneroth 07-11-2012 00:35 0

opera.rulez, да я знаю, просто на автомате отправил, а стереть нельзя

по теме: по видимому я слишком непонятно выразил мысть. Я имею в виду конечно же программирование на С++. Интересно узнать как много людей воспользовались плюсами "плюсов" (в смысле нововведениями), и как много не смогли\не захотели оставлять небезопастный, но ставший привычным printf("Hello, %s", userName);

opera.rulez 07-11-2012 00:42 0

MrGeneroth, На мой взгляд использовать ООП в C++ в том виде, как оно реализовано в стандартной библиотеке, — всё равно, что забивать гвозди микроскопом. Такое ощущение, что разработчики его сделали исключительно для демонстрации перегрузки операторов.

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

#include <iostream>
int main() {
std::cout<<!0&&0;
return 0;
}


Что же касается printf, то есть и его более безопасные аналоги (snprintf, vnsprintf, asprintf, vasprintf и т. д.). Единственное, что привлекает в объектно-ориентированном стиле — автоматический выбор метода для вывода любого поддерживаемого типа, когда для printf надо всё указывать вручную. Но ведь автоматический выбор вместе с тем создаёт ограничения: у printf я могу указать любой формат, в каком хочу видеть вывод.

MrGeneroth 07-11-2012 00:52 +1

opera.rulez, Однажды cout мне не понравился тем, что заменив им один из printf'ов, программа увеличила свой размер раза в четыре (точно не помню, но хорошо помню свое удивление). С тех пор я решил, что всякие %d, %0.2f, %x мне ближе... Это конечно нельзя считать решающим аргументом в выборе, но мне показалось, что это слишком.

10-11-2012 23:24 0

Так а в самом противопоставлении уже заложено превосходство printf. Сама эта взаимозаменяемость подтверждает то что миллион раз доказано: не существует задачи в ООП которую нельзя было решить в функциональном программировании, с меньшим расходом ресурсов. ООП - это просто одна из спорных парадигм. ;)

0 комментариев
07-11-2012 01:21 +1

Если сравнивать scanf и cin то scanf однозначно впереди, потому что значительно быстрее, тут же соut мне нравится больше

0 комментариев
08-11-2012 14:54 0

Удобнее и современнее использовать потоки
BerkutOi, cin и его ООП-аналоги ничем не хуже scanf. О значительном превосходстве scanf говорить, с теми ресурсами современных компьютеров просто глупо.

6 комментариев
opera.rulez 08-11-2012 21:25 0

i.c, А разве только в ресурсах дело? Пока я не увидел, чем же потоки лучше, кроме того, что это модно, молодёжно и всё такое.

И да, решите задачку:

#include <iostream>
int main() {
std::cout<<!0&&0;
return 0;
}


Что выведет программа?

i.c 09-11-2012 20:53 0

opera.rulez, Выводит так единицу, хотя по идее вроде должна выводить 0.

i.c 09-11-2012 21:05 0

i.c, Да, так:
#include <iostream>
int main() {
bool b = !0&&0;
std::cout<<b;
return 0;
}

Выводит 0.

opera.rulez 09-11-2012 21:33 0

i.c, Сможете объяснить, по какой идее программа должна выводить ноль и почему на практике она выводит единицу?

i.c 10-11-2012 20:54 0

opera.rulez, По закону исключения констант:
A&&0 = 0

!0 = 1 (!false = true)
0 = 0
Получается, что 1&&0 = 0

А почему
std::cout<<!0&&0;
выводит 1 я не знаю и буду рад услышать ответ от Вас.

Тем не менее можно использовать отдельную булеву переменную и выводить её значения, тогда ответ будет правильный.

opera.rulez 10-11-2012 22:46 0

i.c, А теперь объяснение, почему программа выводит единицу. Оператор << имеет наивысший приоритет всегда. Компилятору безразлично, выполняет он сдвиг или перегружен. Поэтому выражение std::cout<<!0&&0; следует читать так:
(std::cout<<!0) && 0;
И никак иначе. Да, после логического И нолик представляет собой бессмысленную команду, которая ничего не делает, но поскольку порядок выполнения слева направо, то первое выражение выполнится и напечатает !0, то есть единицу.

Я ничего не имею против объектно-ориентированного программирования (и даже за, потому что ООП помогает расширять имеющийся код), но вынужден констатировать, что перегрузка операторов таит опасность, ибо она неинтуитивна.

08-11-2012 22:28 0

scanf/printf - это функция.
cin/cout - это объект класса iostream.
И вот теперь уже идёт вся тема с чем вам приходится работать. От себя лишь добавлю, что потоковое управление данными, делает программу кроссплатформенной. К тому же управление потоками - это основы объектно-ориентированного программирования.

1 комментарий
opera.rulez 08-11-2012 22:31 +1

Konsensus93, Само по себе потоковое управление данными программу кроссплатформенной не делает. Так же, как и в случае с printf, нужны библиотеки для каждой платформы.