| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Почему используют в С++ printf, void main() и т.д. |
| Автор: Кнером 28.5.2006, 18:30 | ||||||||
| Приступил к изучению С++. Не понимаю, почему программисты пишущие на С++ используют такие функции как printf, void main() и т.д. Пример.
Зачем у заголовков указывают расширение? Если новые заголовки не являются именами файлов? В одной из книг было написано, что новый вид заголовков является виртуальным включаемым файлом, который содержит информацию в предварительном скомпилированном виде. Почему указывают тив главной финкции void? Если по правилам она должна быть типа int? Лично у меня все 3 компилятора дают оплевуху и сообщают, что функция должна быть типа int. Для чего и почему использую функции и С. К примеру, printf. Если в С++ нуно использовать функцию cout. В одной из книги было написано, что эта функция усовершенствованная printf. И так далее... Было так же написано, что если программист использует функции С в С++, то не смысла тогда вообще использовать С++. Так как все равно он не использует приимущества С++. На форуме не раз встречал, что человек говорит, что написал программу на С++. А в коде присуствует все выше описанное... Больше всего меня запутал купленный мною справочник. С++. Специальный справочник (2-е издание) / Карпов Б., Баранова Т. СПБ.: Питер, 2005 - 381 с.: Ил. Обложка синяя, текст желтый с белым. Несколько примеров кода из книги.
При компилировании выдает.
Первая программа на С++.
Если заменить void на int, тогда программа будет скомпилирована. Такое ощущение, что все в перемешку. Лишь бы купили книгу. - Дополнительно хочу спросить, что является в действительности оператором вывода в С++. 1. cout 2. cout << 3. << Просто как я понимаю, cout это подпрограмма, которая связывается с терминалом, с консолью. А два угла уже осуществляют передачу в предоставленный терпимал. Если к примеру нужно будет вывести на принтер. То нужно будет указать некий ptr. Просто уще не знаю как вывести на принтер. Тогда получается, что оператором вывода можно считать два угла. В книге написано, что оператор вывода это cout. Всем ответившим спасибо. |
| Автор: MAKCim 28.5.2006, 18:44 | ||||||||||
это объект типа ostream ostream - это typedef basic_ostream<char>
<<
выкинь книжку
согласен
не поддавайся |
| Автор: ZeusAtVingrad 28.5.2006, 21:34 | ||||||||||||||||
Ты приступил к изучению С++ или к изучению программистов С++?
Смелые, однако, заявления.
Ну и указывай int. Делов-то! Это не главное отличие C и C++.
cout - не функция, стандартный поток вывода программы. Объект класса, как уже написали.
Автор книги имеет весьма своеобразное представление о преимуществах C++. C++ - это: - объектно-ориентированное программирование; - шаблонное программирование; - мощная стандартная библиотека; - ну и прочие "мелочи".
Из всего перечисленного оператор: <<
Стандартная библиотека ничего о принтерах не знает. Придётся использовать другие методы.
Не знаю хорошо ли это для новичка, но я присоединюсь к предыдущему оратору и посоветую Страуструпа. |
| Автор: Xenon 28.5.2006, 22:05 | ||
ZeusAtVingrad Просто в стандрте C++ рекомендуется использовать
|
| Автор: MAKCim 28.5.2006, 22:10 | ||
цитату можно? а то я что-то не уверен в этом |
| Автор: Xenon 28.5.2006, 22:20 |
| Где-то было, я точно не помню. Вроде как для винды, а тем более для VC это стандарт Но то, что main должна быть с int, Это, вроде как, точно стандрт? |
| Автор: Кнером 28.5.2006, 23:12 | ||||||||||||||||||
| MAKCim, спасибо за совет. -
-
Автор книги громких зявлений.
Я понимаю, что это не главное отличие. Я не понимаю, почему человек говорит, что этот код написан на С++, а не на С.
Я спросил: "для чего и почему в С++ используют функции из С". Если это конечно позволяет компилятор. XenonSk, как я знаю: - #include "stdafx.h", это из MS Visual Studio, а не из стандарта С++. - int argc, _TCHAR* argv[], это не обязательный параметр, так как мы программе ничего не передаем при ее запуске. Что по поводу справочника? Добавлено @ 23:17 |
| Автор: Кнером 29.5.2006, 00:00 | ||
А на С программа "Hello World!" весит 2,70 кб, а на С++ 5 кб. Тогда лучше использовать С? Получается, что программистов на С++ можно разделить на две категории: 1) те кто используют традиционную версию С++ (в перемешку С и С++) 2) те кто используют Standard C++ (чистый С++ с наворотами, нельяз использовать С) Просто в книге написано, что на сегодняшний день во всх компиляторах реализован Standard C++ |
| Автор: Любитель 29.5.2006, 00:30 | ||
| Стандарт предусматривает сишные функции ради соместимоти, правда большинство заголовочных файлов заменены с xxx.h на cxxx (например stdlib.h - cstdlib) и имена объявлены в неймспейсе std. Насчёт производительности и читабельности - надо разумно выбирать. Сомневаюсь, что 5 килобайт это очень тяжело, и что производительность упала так, что надо прибегать к извращенским методам. Насчёт пример из книжки: писал человек, ориентирующийся на VC++ 6. Дело в том, что по стандарту main возвращает int (как в C, так и в C++), но бывают ситуации (обычно отдельные ветки), когда она может ничего не возвращать (например - аварийное завершение). Компилеры для любой другой функции при этом выдадут варнинги, для main не должны. В VC++ 6 было не так, как следствие - разрешили void для main. Ну а впервом примере забыли, что в нормальных реализациях STL все имена (в том числе манипуляторы oct и endl, поток cout) объявлены в пространстве имён std. Есть три варианта решения проблемы:
Кстати заметь, что в первых двух случаях оператор <<, так же перегруженный внутри std раскрывается за счёт ADL. Последний вопрос - для чего изучать сишные приёмы в C++. На мой взгляд смысл есть, хотя надо помнить, что это именно сишные вещи. А смысл, во-первых в том, что C++ - это всё-таки гибридный язык (по крайней мере если смотреть на большинство практического кода). Во вторых, си - тоже не помешает. В третьих, очень многме хорошие книжки (например, понравившаяся мне - "Философия C++. Практическое программирование") подчёркивают приёмы C++ через противопоставление приёмам C. |
| Автор: Кнером 29.5.2006, 01:03 |
| Любитель, благодарю Вас за подробный ответ и не большой совет. |
| Автор: Любитель 29.5.2006, 01:13 | ||
Спасибо!
|
| Автор: Кнером 29.5.2006, 05:14 |
| Любитель, извини, что так официально. Обещаю исправиться Всем спасибо, вопрос решен. |
| Автор: ZeusAtVingrad 29.5.2006, 09:23 | ||||
Неуверен ни в stdafx.h ни в _TCHAR. Ни того ни другого в "стандарте" думаю нет, т.к. это заморочки конкретного компилятора. |
| Автор: bel_nikita 8.6.2006, 23:33 | ||||||||
ИМХО, хорошим стилем считается конструкция:
|
| Автор: Xenon 8.6.2006, 23:57 | ||
Насчет stdafx.h - это я его ненароком сунул. А конструкция
имхо, считается, хорошим стилем |
| Автор: LPBOY 8.6.2006, 23:57 | ||
+1 Правда, параметры и return 0 можно опускать:
|
| Автор: Xenon 8.6.2006, 23:58 |
| LPBOY А зачем тогда писать int main, если ты ничего не ретурнишь? |
| Автор: LPBOY 9.6.2006, 00:02 |
| В этом случае автоматически ретурнится 0, если выполнилась последняя инструкция функции main. |
| Автор: DaJunior 9.6.2006, 06:46 | ||||
| сообщение 8.6.2006, 23:57 Это с каких это пор такая конструкция считается хорошим стилем?!?!?!?
Вообще int main() означает, что программа после выполнения вернет значение типа int, и все... если так пишешь, то в конце гл. ф-ии соизволь написать return 0; Если ты пишешь void main(void), то это значит, что ф-ия не возвращает значений, и не принимает их в качестве параметров. А вообще мое мнение - если твоя прога ничего не возвращает, то и напиши ты void перед main'ом, потом самому понятней будет. /////////////////////////////////////////////////////////////////////////////////////////////////// И вообще, если уж пошла речь о правильном стиле программирования, то лучше почитайте книгу "Правила программирования на Си и СИ++(Ален И.Голуб)" - рекомендую всем! А чтобы не возникало
|
| Автор: Кнером 9.6.2006, 07:56 |
| DaJunior, об этом и более точно уже написал LPBOY. |
| Автор: MAKCim 9.6.2006, 09:12 | ||
далеко не бред например в юниксах (быть может не только в них) по завершении программы оболочка записывает в специальную переменную код завершения. Нормальным кодом завершения считается 0, и многие скрипты его проверяют. В случае если main не возвращает ничего, то код завершения - в общем случае произвольный, случайный. Оттого даже правильно отработавшая программа с внешней точки зрения может оказаться неправильно отработавшей |
| Автор: Xenon 9.6.2006, 09:16 |
| DaJunior, Ну тогда давай вообще все правила хорошего тона будем считать бредом и будем писать код кое-как, что только самому разработчику понятно. Есть же, блин, кананоы определенные. |
| Автор: Кнером 10.6.2006, 00:18 |
Чтобы было легче жить. Если так можно сказать. Жизнь и так сложна. Нужно упрощать, а не усложнять. XenonSk, это как дополнение. |
| Автор: harper 12.6.2006, 06:07 |
| кстати, а почему << оператор вывода? это же оператор сдвига применительно к объектам класса потоков перегруженный так что осуществляет вывод. или нет? |
| Автор: MAKCim 12.6.2006, 09:51 | ||||
|
| Автор: Oleg_Ci 12.6.2006, 11:14 | ||||
Перегруженный оператор '<<' называется оператором вставки, в том облике как его представляет класс ostream. Класс ostream включает функцию 'operator<<()', а 'cout' является объектом класса ostream, соответственно оператор '<<' (функция-элемент) может вызываться обьектом 'cout' ( cout << ). Или по другому - ofstream включает ещё методы 'put()', 'write()', соответственно можно написать cout.put('A'); cout.write("aaa",3); ,т.е. 'cout' - это объект класса, '<<' - это метод класса, а 'cout<<' - а эта конструкция, вроде называется - вызов функции. Функция-член 'operator<<' принимает 2 аргумента , 1-ссылка на класс ostream (cout<<"aa" - левый операнд), 2-что напечатать надо (cout<<"aa" - правый операнд), поэтому когда пишем 'cout<<"aa"' мы на самом деле вызываем функцию 'operator<<'. Ещё можно написать вот так: operator<<(cout,"aaa").
|