Чем отличается в c++ int main() от void main().
Т. е. точка выхода.
Можно ее пропустить, конечно, тогда компилятор автоматически добавит return 0; в конец программы.
Это значение передается вызывающему процессу (например, операционной системе) чтобы он «понял», что программа завершена корректно.
Второй вариант:
void main()
по завершении программы ничего не возвращает, что может привести к различным проблемам.
Это можно обойти с помощью функции exit();
Но тем не менее, запись void main() не соответствует стандарту и считается некорректной, и некоторые компиляторы ее не принимают.
Остальные ответы
Второй вариант формально не является правильным и его скомпилирует не каждый компилятор.
Первый вариант может возвращать код ошибки.
Второй вариант не может возвращать код ошибки.
Первый вариант будет компилироваться в любом нормальном компиляторе.
Второй вариант будет редко где компилироваться.
void это функция которая не возвращает значений, а int это целочисленная функция и она возвращает значение то есть return
Не слушайте быдлокодеров. Когда вы пишете Int — вы указываете компьютеру, что вы резервируете место в его памяти, куда функция вернет число в диапазоне от (примерно) минус двух миллиардов до плюс двух миллиардов. Вы часто в жизни с двумя миллиардами что-то считаете? Я вот тоже не часто. Всегда используйте наименьший тип данных, который позволяет использовать задача, тем самым вы рационально используете ресурсы компьютера. А то программисту нужны в программе числа в районе нескольких тысяч, а он в нее эти инты понапихал, и куча памяти просто занята, хотя и не используется.
Когда вы указываете тип возвращаемого значения void, это значит, что вы возвращаете НИЧЕГО. ПУСТОТУ. Вы указываете компьютеру, что ничего в памяти не резервируете. Так же вы в конце main пишете просто return — выйти из функции. Упаси вас бог думать, что функция main по умолчанию что-то там в память записывает, нули всякие, нет, она просто по окончании своей работы дает системе знать, что все, программа завершена. Или передает управление командой строке, если вы работаете в консоли.
Функция main и выполнение программ
Каждая программа C имеет основную функцию, которая должна иметь имя main . Функция main служит отправной точкой для выполнения программы. Она обычно управляет выполнением программы, вызывая другие ее функции.
К функции применяется несколько ограничений main , которые не применяются к другим функциям C. Функция main :
- Не может быть объявлен как inline .
- Не может быть объявлен как static .
- Не может быть принято его адрес.
- Не удается вызвать из программы.
Сигнатура main функции
Функция main не имеет объявления, так как она встроена в язык. Если это так, синтаксис объявления для main будет выглядеть следующим образом:
int main( void ); int main( int argc, char *argv[ ] ); int main( int argc, char *argv[ ], char *envp[ ] );
Функция main объявляется неявно с помощью одной из этих сигнатур. При определении main функции можно использовать любую из этих сигнатур. Компилятор Майкрософт также позволяет main иметь тип возвращаемого void значения, если значение не возвращается. Параметры argv и envp можно wmain также определить как тип char** . Дополнительные сведения о аргументах см. в разделе Описание аргумента.
Примечания
Функции в исходном коде программы выполняют одну или несколько конкретных задач. Функция main может вызывать эти функции для выполнения соответствующих задач. При main вызове другой функции она передает управление выполнением функции, поэтому выполнение начинается с первого оператора в функции. Функция возвращает управление при main выполнении return инструкции или достижении конца функции.
Можно объявить любую функцию, включая main , для получения параметров. Термин «параметр» или «формальный параметр» относится к идентификатору, получающему значение, передаваемое функции. Сведения о передаче аргументов в качестве параметров вы найдете в статье Параметры. Когда одна функция вызывает другую, вызываемая функция получает значения своих параметров от вызывающей функции. Эти значения называются аргументами. Можно объявить формальные параметры в , main чтобы получать аргументы из командной строки в формате, показанном в сигнатуре функции.
Если вы хотите передать сведения в функцию main , параметры обычно называются argc и argv , хотя компилятор C не требует этих имен. Как правило, если третий параметр передается в main , этот параметр называется envp . Типы для argc , argv и envp определяются языком C. Можно также объявить argv как char** argv и envp как char** envp . В приведенных ниже в данном разделе примерах описывается использование этих трех параметров для доступа к аргументам командной строки. Эти параметры объясняются в следующих разделах.
Если ваш код соответствует модели программирования в Юникоде, в качестве точки входа в программу можно использовать версию расширенных символов main wmain майкрософт , . Дополнительные сведения об этой версии с расширенными символами main см. в разделе Использование wmain .
main Прекращения
Программа обычно прекращает выполнение, когда она возвращается из или достигает конца main , хотя она может завершиться в других точках программы по различным причинам. Например, может потребоваться принудительное завершение программы при обнаружении некоторого состояния ошибки. Для этого можно использовать функцию exit . Дополнительные сведения и exit пример использования см. в разделе exit .
Void main()
Здесь описана и инициализирована целая переменная и два указателя на целые (int) переменные. Указатель а получает значение адреса переменной, а указатель b — значение на единицу большее. Затем печатаются адрес переменной и разность указателей, каждый из которых приведен к целому числовому типу. Казалось бы, раз b на единицу больше а, то разность между ними есть 1. При печати вы, однако, увидели бы не 1, а 2. Если заменить в описаниях int на long, то напечаталось бы 4. Дело в том, что здесь печатается разность номеров байтов, начиная с которых размещаются переменные соответствующего типа, и если переменная а размещена в байтах номер N и номер N+1 (тип int занимает два байта), то следующая переменная, указатель на которую увеличен на единицу, будет размещена в байтах N+2 и N+3. Поэтому разность указателей и составляет 2 байта, а для типа long — 4 байта.
Принципиальный момент для языка С: условились считать, что имя массива (без индексов) само уже является указателем на начало этого массива, то есть если описан массив t[15], то t есть &t[0]. Тогда понятно, что *t есть значение начального элемента массива и вообще *(t+i) есть не что иное, как t[i]. Более того, еще до начала компиляции программы препроцессор, о котором мы вскользь упоминали раньше, производит замену в тексте всех конструкций типа u[i] на конструкции *(u+i). Из этого, в частности, следует, что совершенно чудовищная, на первый взгляд, конструкция 3[р] будет совершенно безболезненно пропущена компилятором, и если вы имели в виду р[3], то все в программе будет в порядке. Тогда, если вы хотите слегка облегчить работу системы и уменьшить время обработки (но не исполнения) программы, пишите всегда *(р+4) вместо р[4].
В заключении параграфа приведем еще одну программу:
Viod main()
Автор тешит себя надеждой, что читатель уже достаточно опытен для того, чтобы понять, что эта программа выведет на экран три числа 1.4, 3.3 и 5.2.
Функции
До сих пор в наших программах мы использовали одну единственную «самодельную» функцию с именем main — главная. При необходимости программа может содержать достаточно большое количество функций, среди которых, однако, присутствие функции main в консольных приложениях обязательно, поскольку именно с нее начинается выполнение любой программы. Описание и использование «самодельных» функций демонстрирует следующая программа:
/*Это —— первая функция*/
double sqr(double х)
/*Это —— вторая функция*/
double cub(double x)
/*Это —— главная функция*/
Void main(void)
double у;
printf(«y=%3.1lf y^2=%3.1lf y^3=%3.1lf\n», y,sqr(y),cub(y));
Начнем с того, что не имеет отношения к описаниям функций, но впервые появилось в нашей программе. Речь идет о так называемых комментариях. Комментарием является все, что стоит между открывающей конструкцией /* и закрывающей конструкцией */. Присутствие в программе комментариев никакого влияния ни на что не оказывает. Система вообще не видит комментариев, и они предназначены только для человека, читающего программу. Зато этому человеку комментарии могут сообщить полезную информацию, как это и сделано в последней программе. Комментарий в одной строке можно организовать и по-другому: напишите конструкцию //. Все, что находится после этой конструкции до конца строки, будет комментарием.
Теперь в нашей программе описана функция с именем sqr. Общая форма описания функции имеет вид:
ТипФункции ИмяФункции(ТипАргумента1 Аргумент1, ТипАргумента2 Аргумент2. ) ;
Если назначение функции заключается в вычислении одного значения, то есть, как говорят Гуру от программирования, если функция возвращает значение, то тип функции должен быть указан, и таким типом является тип возвращаемого значения. В нашей программе функция имеет тип double, стало быть, функция возвращает вещественное число с двойной точностью. Если тип функции не указан, то, по умолчанию, она считается целочисленной функцией (типа int). Если функция не возвращает никакого значения, то она имеет тип void — никакой. Несмотря на отсутствие типа, слово void в описании должно присутствовать. Во всех наших программах функции main не возвращали значений и описывались как void. Функции, возвращающие значение, обязаны содержать в своем теле хотя бы одно так называемое выражение возврата:
return ВозвращаемоеЗначение;
Слово return и означает ВЕРНУТЬ, и после него следует выражение, вычисляющее возвращаемое значение. В функциях сложной структуры, имеющих, например, несколько альтернативных путей выполнения, возможно присутствие нескольких выражений return. Нужно помнить, что выполнение любого из выражений возврата приводит к немедленному завершению выполнения функции, передаче возвращаемого значения «наружу» и переходу к участку программы, непосредственно следующему за обращением к этой функции.
Нетрудно видеть, что функция sqr возвращает квадрат своего аргумента. В некоторых языках программирования именно под таким именем существует именно такая функция, вычисляющая квадрат своего аргумента, но не «самодельная», а стандартная. Там она ничем не отличается от других стандартных функций: sin, еxр, sqrt и так далее. В С такой стандартной функции нет. Так что если вам непременно хочется ее иметь, то придется изготовить ее своими руками, что в последней программе и сделано.
В скобках после имени функции находится список аргументов, разделенных запятыми. Для каждого аргумента указывается его тип. Даже если в списке есть несколько аргументов одного типа, их нельзя объединять под одним словом описания типа, как это, например, можно было делать при объявлении переменных. Такая «причуда» имеет своей целью, в частности, уберечь программиста от злоупотребления большим числом аргументов функций. В нашем примере список аргументов состоит из одного параметра, но это только частный случай. Необходимо обратить внимание на одно крайне важное обстоятельство. Принимая свой аргумент, функция делает с него копию и работает уже с этой копией, а не с самим значением. По этой причине, если вы в теле функции измените, как вам кажется, значение аргумента, то после выхода из функции в вызывающую ее часть программы вы с удивлением можете обнаружить, что значение аргумента не изменилось. У такой особенности построения функций в С есть свои преимущества и свои недостатки, которые мы обсудим несколько позднее.
Функция может и не иметь ни одного аргумента. Так, наприме, зачем параметры могут понадобиться функции clrscr, если ее назначение — очистка экрана? Она ведь даже не возвращает значения, не имеет типа. В случае отсутствия у функции аргументов вы можете при описании воспользоваться пустыми скобками (). Для тех, кто любит во всем порядок, как автор этих строк, посоветуем избавить себя от дискомфорта при взгляде на эти пустые скобки и писать (void). Вот мы и полностью разобрались с непонятной поначалу строкой из самой первой нашей программы void main(void). Как видите, автор выполняет свои обещания.
Тело функции — это запрограммированный рецепт выполнения некоторых действий. Говорить особо о построении тела функции нет смысла, поскольку до сих пор мы только этим и занимались. Ну, разве что еще раз напомним, что функция, имеющая любой тип, отличный от void, должна возвращать значение с помощью выражения возврата. В функции sqr тело до крайности простое. Оно даже не содержит ни одного выражения, кроме выражения возврата return x*x. С последним же все ясно. Вы, конечно, догадываетесь, что такая простая ситуация скорее исключение, чем правило.
Уже следующая функция в нашей программе выглядит чуть сложнее. Заметьте, что вторая функция cub находится в программе после функции sqr и поэтому знает, что функция sqr собой представляет. Аналогично функция main знает обе функции: и sqr и cub. Такую естественную последовательность рекомендуется соблюдать в программе, хотя несложные средства, демонстрируемые далее, позволят вам изменить этот порядок.
Функция cub, как это следует из ее имени, вычисляет куб своего аргумента. Если бы выражение возврата в ней мы записали в виде return x*x*x; (что было бы не хуже представленного выше варианта), то нам было бы нечего добавить к тому, что говорилось о функции sqr. Однако здесь функция возведения в куб использует функцию возведения в квадрат, то есть при своей работе функция cub обращается к уже известной ей функции sqr. В свою очередь, главная функция обращается к описанным ранее функциям и успешно распечатывает таблицу квадратов и кубов чисел от 0 до 10 с шагом 1. Мы вполне сознаем, что такую таблицу можно было бы изготовить значительно проще. Программу следует рассматривать только как учебный пример и не более того.
В приведенном примере внутри «самодельных» функций sqr и cub, в отличие от функции main, нам не пришлось описывать никаких дополнительных переменных. Однако и это скорее исключение, чем правило. Следующая программа демонстрирует более реалистичную ситуацию:
Чем отличаются функции начинающиеся с void от int в Си?
Первый вариант, по-хорошему, не должен бы компилироваться: сказано, что функция возвращает целое число, но ни одного return при этом в теле нет. main же случай особый, но его полная сигнатура по-хорошему включает возврат int (код выхода) и приём массива строк (аргументов командной строки) в виде числа элементов и указателя на нулевой из них. Но из-за исторически сложившегося разброда инструменты могут стерпеть и ряд других записей.
– user181100
2 апр 2018 в 20:54
Первый вариант не будет компилироваться.
2 апр 2018 в 20:55
void функции в Си соответствуют подпрограммам (исторически они появились до функций) в других языках. Попробуйте почитать в вике (по ссылкам). По сути разница в том, что основным назначением функции (по крайней мере к этому стоит стремиться) является возврат чистого результата, а подпрограммы — побочные эффекты
2 апр 2018 в 22:06
void-функция не возвращает значение. Вот и всё. Например, они могут что то изменять по ссылке, или отображать что то пользователю. С драйверами это вообще никак не связано.