Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Почему используют в С++ printf, void main() и т.д.


Автор: Кнером 28.5.2006, 18:30
Приступил к изучению С++. Не понимаю, почему программисты
пишущие на С++ используют такие функции как printf, void main() и т.д.

Пример.
Цитата
#include <iostream.h>    
#include <conio.h>    
#include <string.h>    

void main(void)    
{


Зачем у заголовков указывают расширение? Если новые заголовки
не являются именами файлов? В одной из книг было написано, что
новый вид заголовков является виртуальным включаемым файлом,
который содержит информацию в предварительном скомпилированном виде.

Почему указывают тив главной финкции void? Если по правилам
она должна быть типа int? Лично у меня все 3 компилятора
дают оплевуху и сообщают, что функция должна быть типа int.

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

И так далее...

Было так же написано, что если программист использует функции
С в С++, то не смысла тогда вообще использовать С++.
Так как все равно он не использует приимущества С++.

На форуме не раз встречал, что человек говорит, что написал программу
на С++. А в коде присуствует все выше описанное...

Больше всего меня запутал купленный мною справочник.
С++. Специальный справочник (2-е издание) / Карпов Б., Баранова Т.
СПБ.: Питер, 2005 - 381 с.: Ил.
Обложка синяя, текст желтый с белым.

Несколько примеров кода из книги.

Код

#include <iostream.h>
void main()
{
  int n=123;
  cout << oct << n << endl;
}


При компилировании выдает.

Цитата

main.cpp:3: error: `main' must return `int'
main.cpp: In function `int main(...)':
main.cpp:5: error: `oct' undeclared (first use this function)
main.cpp:5: error: (Each undeclared identifier is reported only once for each function it appears in.)


Первая программа на С++.

Код

#include <stdio.h>
void main()
{
  printf ("\nЗдравствуй, мир!");
}


Если заменить void на int, тогда программа будет скомпилирована.

Такое ощущение, что все в перемешку. Лишь бы купили книгу.

-

Дополнительно хочу спросить, что является в действительности
оператором вывода в С++.
1. cout
2. cout <<
3. <<

Просто как я понимаю, cout это подпрограмма, которая связывается с
терминалом, с консолью. А два угла уже осуществляют передачу в
предоставленный терпимал.

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

В книге написано, что оператор вывода это cout.

Всем ответившим спасибо.

Автор: MAKCim 28.5.2006, 18:44
Цитата

cout это подпрограмма,

это объект типа ostream
ostream - это typedef basic_ostream<char>
Цитата

Дополнительно хочу спросить, что является в действительности
оператором вывода в С++.

<<
Цитата

В книге написано, что оператор вывода это cout.

выкинь книжку  smile 
Цитата

Было так же написано, что если программист использует функции
С в С++, то не смысла тогда вообще использовать С++.
Так как все равно он не использует приимущества С++.

согласен
Цитата

Такое ощущение, что все в перемешку. Лишь бы купили книгу.

не поддавайся  smile , покупай Страуструпа  smile   

Автор: ZeusAtVingrad 28.5.2006, 21:34
Цитата

Приступил к изучению С++. Не понимаю, почему программисты
пишущие на С++ используют такие функции как printf, void main() и т.д.

Ты приступил к изучению С++ или к изучению программистов С++? smile

Цитата

Цитата 
#include <iostream.h>    
#include <conio.h>    
#include <string.h>    
Зачем у заголовков указывают расширение? Если новые заголовки
не являются именами файлов? В одной из книг было написано, что
новый вид заголовков является виртуальным включаемым файлом,
который содержит информацию в предварительном скомпилированном виде.

Смелые, однако, заявления.

Цитата

Почему указывают тив главной финкции void? Если по правилам
она должна быть типа int? Лично у меня все 3 компилятора
дают оплевуху и сообщают, что функция должна быть типа int.

Ну и указывай int. Делов-то!
Это не главное отличие C и C++.

Цитата

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

cout - не функция, стандартный поток вывода программы. Объект класса, как уже написали.

Цитата

Было так же написано, что если программист использует функции
С в С++, то не смысла тогда вообще использовать С++.
Так как все равно он не использует приимущества С++.

 smile 
Автор книги имеет весьма своеобразное представление о преимуществах C++.
C++ - это:
- объектно-ориентированное программирование;
- шаблонное программирование;
- мощная стандартная библиотека;
- ну и прочие "мелочи".

Цитата

Дополнительно хочу спросить, что является в действительности
оператором вывода в С++.
1. cout
2. cout <<
3. <<

Из всего перечисленного оператор: <<

Цитата

Если к примеру нужно будет вывести на принтер. То нужно будет
указать некий ptr. Просто уще не знаю как вывести на принтер.

Стандартная библиотека ничего о принтерах не знает.
Придётся использовать другие методы.

Цитата

В книге написано, что оператор вывода это cout.

Не знаю хорошо ли это для новичка, но я присоединюсь к предыдущему оратору и посоветую Страуструпа. 

Автор: Xenon 28.5.2006, 22:05
ZeusAtVingrad Просто в стандрте C++ рекомендуется использовать
Код

#include "stdafx.h"
int main(int argc, _TCHAR* argv[])
{
    return 0;
}
 

Автор: MAKCim 28.5.2006, 22:10
Цитата

Просто в стандрте C++ рекомендуется использовать

цитату можно? а то я что-то не уверен в этом  

Автор: Xenon 28.5.2006, 22:20
Где-то было, я точно не помню. Вроде как для винды, а тем более для VC это стандарт smile Может мне показалось, но вроде было ...
Но то, что main должна быть с int, Это, вроде как, точно стандрт? 

Автор: Кнером 28.5.2006, 23:12
MAKCim, спасибо за совет.

-

Цитата
Ты приступил к изучению С++ или к изучению программистов С++? smile

 smile 

Цитата
Цитата

Цитата 
#include <iostream.h>    
#include <conio.h>    
#include <string.h>    
Зачем у заголовков указывают расширение? Если новые заголовки
не являются именами файлов? В одной из книг было написано, что
новый вид заголовков является виртуальным включаемым файлом,
который содержит информацию в предварительном скомпилированном виде.

Смелые, однако, заявления.

Цитата

Было так же написано, что если программист использует функции
С в С++, то не смысла тогда вообще использовать С++.
Так как все равно он не использует приимущества С++.

 smile 
Автор книги имеет весьма своеобразное представление о преимуществах C++.
C++ - это:
- объектно-ориентированное программирование;
- шаблонное программирование;
- мощная стандартная библиотека;
- ну и прочие "мелочи".

-
Цитата

Автор книги Брайн Оверленд на протяжении десяти лет работал в компании
Microsoft программистом, руководителем проектов и писателем - уникальная
комбинация, которая позволила написать множество понятных и точных книг
по программированию.

Автор книги громких зявлений.  smile 

Цитата
Цитата

Почему указывают тив главной финкции void? Если по правилам
она должна быть типа int? Лично у меня все 3 компилятора
дают оплевуху и сообщают, что функция должна быть типа int.

Ну и указывай int. Делов-то!
Это не главное отличие C и C++.

Я понимаю, что это не главное отличие. Я не понимаю, почему человек говорит,
что этот код написан на С++, а не на С.

Цитата
Цитата

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

cout - не функция, стандартный поток вывода программы. Объект класса, как уже написали.

Я спросил: "для чего и почему в С++ используют функции из С".
Если это конечно позволяет компилятор.

XenonSk, как я знаю:
- #include "stdafx.h", это из MS Visual Studio, а не из стандарта С++.
- int argc, _TCHAR* argv[], это не обязательный параметр, так как мы программе
ничего не передаем при ее запуске.

Что по поводу справочника?

Добавлено @ 23:17 
Цитата(XenonSk @  28.5.2006,  22:20 Найти цитируемый пост)
а тем более для VC это стандарт
  smile 
 

Автор: sergejzr 28.5.2006, 23:21
Цитата(Кнером @  28.5.2006,  16:30 Найти цитируемый пост)
Для чего и почему использую функции и С. К примеру, printf.
Если в С++ нуно использовать функцию cout. В одной из книги
было написано, что эта функция усовершенствованная printf.

Насколько меня научили (сам не измерял) printf намного быстрее, чем  cout. 

Автор: Кнером 29.5.2006, 00:00
Цитата(sergej.z @  28.5.2006,  23:21 Найти цитируемый пост)
Насколько меня научили (сам не измерял) printf намного быстрее, чем  cout.

А на С программа "Hello World!" весит 2,70 кб, а на С++ 5 кб. Тогда лучше использовать С?
Получается, что программистов на С++ можно разделить на две категории:
1) те кто используют традиционную версию С++ (в перемешку С и С++)
2) те кто используют Standard C++ (чистый С++ с наворотами, нельяз использовать С)

Просто в книге написано, что на сегодняшний день во всх компиляторах реализован Standard C++  smile 
 

Автор: Любитель 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. Есть три варианта решения проблемы:
Код

//1
#include <iostream>

int main()
{
   int n = 123;
   std::cout << std::oct << n << std::endl;
   return 0;
}

//2
#include <iostream>

using std::cout;
using std::oct;
using std::endl;

int main()
{
  int n = 123;
  cout << oct << n << endl;
  return 0;
}

//3
#include <iostream>

using namespace std;

int main()
{
  int n = 123;
  cout << oct << n << endl;
  return 0;
}

Кстати заметь, что в первых двух случаях оператор <<, так же перегруженный внутри std раскрывается за счёт ADL.

Последний вопрос - для чего изучать сишные приёмы в C++. На мой взгляд смысл есть, хотя надо помнить, что это именно сишные вещи. А смысл, во-первых в том, что C++ - это всё-таки гибридный язык (по крайней мере если смотреть на большинство практического кода). Во вторых, си - тоже не помешает. В третьих, очень многме хорошие книжки (например, понравившаяся мне - "Философия C++. Практическое программирование") подчёркивают приёмы C++ через противопоставление приёмам C. 

Автор: Кнером 29.5.2006, 01:03
Любитель, благодарю Вас за подробный ответ и не большой совет. 

Автор: Любитель 29.5.2006, 01:13
Спасибо!  smile 

 smile 
Цитата

Вас
За что же так сразу? 

Автор: Кнером 29.5.2006, 05:14
Любитель, извини, что так официально. Обещаю исправиться  smile 
Всем спасибо, вопрос решен. 

Автор: ZeusAtVingrad 29.5.2006, 09:23
Цитата(XenonSk @ 28.5.2006,  22:05)
ZeusAtVingrad Просто в стандрте C++ рекомендуется использовать
Код

#include "stdafx.h"
int main(int argc, _TCHAR* argv[])
{
    return 0;
}

Неуверен ни в stdafx.h ни в _TCHAR.
Ни того ни другого в "стандарте" думаю нет, т.к. это заморочки конкретного компилятора. 

Автор: bel_nikita 8.6.2006, 23:33
Цитата(ZeusAtVingrad @ 29.5.2006,  08:23)
Цитата(XenonSk @ 28.5.2006,  22:05)
ZeusAtVingrad Просто в стандрте C++ рекомендуется использовать
Код

#include "stdafx.h"
int main(int argc, _TCHAR* argv[])
{
    return 0;
}

Неуверен ни в stdafx.h ни в _TCHAR.
Ни того ни другого в "стандарте" думаю нет, т.к. это заморочки конкретного компилятора.

ИМХО, хорошим стилем считается конструкция:
Цитата

int main ( int argc, char *argv[] )
{
  return 0;
}


 

Автор: Xenon 8.6.2006, 23:57
Насчет stdafx.h - это я его ненароком сунул. А конструкция
Код

int main(int argc, char* argv[])
{
  return 0;
}

имхо, считается, хорошим стилем smile Я понимаю, что это не нежно, если в прогу не передаются параметры при запуске, но ... По-мойму это из серии: "А что лучше int main, или void main"   

Автор: LPBOY 8.6.2006, 23:57
Цитата(bel_nikita @  8.6.2006,  23:33 Найти цитируемый пост)
ИМХО, хорошим стилем считается конструкция:

+1 Правда, параметры и return 0 можно опускать:

Код

int main()
{

}
 

Автор: Xenon 8.6.2006, 23:58
LPBOY А зачем тогда писать int main, если ты ничего не ретурнишь? 

Автор: LPBOY 9.6.2006, 00:02
В этом случае автоматически ретурнится 0, если выполнилась последняя инструкция функции main. smile А int main, потому что иначе какие-нибудь comeau или gcc обматерят. smile 

Автор: DaJunior 9.6.2006, 06:46
сообщение 8.6.2006, 23:57

Это с каких это пор такая конструкция считается хорошим стилем?!?!?!?
M
sergej.z
вырезал


Вообще int main() означает, что программа после выполнения вернет значение типа int, и все... если так пишешь, то в конце гл. ф-ии соизволь написать return 0; 

Если ты пишешь void main(void), то это значит, что ф-ия не возвращает значений, и не принимает их в качестве параметров.

А вообще мое мнение - если твоя прога ничего не возвращает, то и напиши ты void перед main'ом, потом самому понятней будет.

///////////////////////////////////////////////////////////////////////////////////////////////////

И вообще, если уж пошла речь о правильном стиле программирования, то лучше почитайте книгу "Правила программирования на Си и СИ++(Ален И.Голуб)" - рекомендую всем!

А чтобы не возникало 
M
sergej.z
вырезал
вопросов у новичков - "Как программировать на С++(Харви Дейтел, Пол Дейтел)" - все разжевано, ребенок поймет. Кстати книга сама по себе оч. интересна даже тем, кто давно программирует, лично меня она оч. порадовала, когда нашел ее в рунете...  

Автор: Кнером 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 @  9.6.2006,  09:16 Найти цитируемый пост)
правила хорошего тона

Чтобы было легче жить. Если так можно сказать. Жизнь и так сложна.
Нужно упрощать, а не усложнять.

XenonSk, это как дополнение.  smile 
 

Автор: harper 12.6.2006, 06:07
кстати, а почему <<  оператор вывода? это же оператор сдвига применительно к объектам класса потоков перегруженный так что осуществляет вывод. или нет? 

Автор: MAKCim 12.6.2006, 09:51
Цитата

кстати, а почему <<  оператор вывода? это же оператор сдвига применительно к объектам класса потоков перегруженный так что осуществляет вывод. или нет? 

Цитата

... Но почему именно <<?. Новый лексический знак придумать невозможно. ... Я пробовал < и >, но их смысл так крепко врос в людские умы, что новые выражения, обозначающие ввод/вывод, для всех практических применений оказались просто нечитабельны.
Операторы << и >> используются для встроенных типов не так часто, чтобы вызвать проблему. Они симметричны в том смысле, что могут использоваться для обозначения "в" и "из". Приоритет операции << не очень высок и позволяет вставлять арифметические выражения в операнды без скобок.

Страуструп (ЯП C++)
 

Автор: Oleg_Ci 12.6.2006, 11:14
Цитата
Дополнительно хочу спросить, что является в действительности
оператором вывода в С++.
1. cout
2. cout <<
3. <<
'cout'  и  'cout<<' - это вобще-то не операторы.
Перегруженный оператор '<<' называется оператором вставки, в том облике как его представляет класс 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").
Код

int main(int argc, char* argv[])
{
   std::cout<<"ddd";
   std::cout.write("  aaa",5);
   std::operator<<(std::cout," bbb");
   std::cin.get();
   return 0;
}
 

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