tag:blogger.com,1999:blog-10303035.post2664740572002338452..comments2024-02-04T23:20:04.066+03:00Comments on Алёна C++: Может ли main возвращать voidAlenahttp://www.blogger.com/profile/09389124127364799922noreply@blogger.comBlogger17125tag:blogger.com,1999:blog-10303035.post-13664420581239108002013-10-09T07:59:04.009+04:002013-10-09T07:59:04.009+04:00Здесь выше камент один: "Предполагаю, что в б...Здесь выше камент один: "Предполагаю, что в большинстве компиляторов функция main возвращает int вне зависимости от того, как объявить её у себя в программе..."<br />Так оно и есть. Когда пишут void main(), имеется в виду как бы аналог процедуры в Паскале, т.е. функции, которая ничего не возвращает. По идее, main - это не процедура, т.к. она возвращает код завершения EXIT_SUCCESS, который обычно равен нулю, если завершилось успешно.Leonoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-56408321069520141832011-09-28T03:22:13.241+04:002011-09-28T03:22:13.241+04:00это таки отдельная тема... Вы не согласны?это таки отдельная тема... Вы не согласны?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-7545577788424812732011-08-08T13:24:29.337+04:002011-08-08T13:24:29.337+04:00А что будет значить int main(int argc, char *argv[...А что будет значить int main(int argc, char *argv[]), ну скажем, в программе для ATMega16?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-28815504173787634322009-04-17T19:30:00.000+04:002009-04-17T19:30:00.000+04:00Можно вообще написать
int main(void)
Если у...Можно вообще написать<br /> <br /> int main(void)<br /><br />Если уж на то пошло.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-51172102442832613442007-06-01T21:51:00.000+04:002007-06-01T21:51:00.000+04:00Несомненно, корректно возвращать int, а void испол...Несомненно, корректно возвращать int, а void использовать некорректно - так утверждает стандарт, и с этим не поспоришь. Некоторые компиляторы считают void main синтаксической ошибкой. Но посмотрим, к чему приводит указание void в компиляторах, где это возможно.<BR/><BR/>Предполагаю, что в большинстве компиляторов функция main возвращает int вне зависимости от того, как объявить её у себя в программе - так как функция main вызывается кодом, стартующем программу, а код этот в большинстве компиляторов берётся из библиотеки. И в этой библиотеке main считается возвращающей int. Соответственно, и после вызова main стартующий код хочет получить (и получает) код возврата (на х86 как правило, содержимое AX/EAX).<BR/><BR/>Соответственно, объявив void main мы в результате выполнения программы вернём операционной системе случайное число (в данном контексте - неизвестное). Вот поэтому компилятор и пишет варнинги... Узнать, так это или нет просто - достаточно посмотреть, какие значения возвращают системе скомпилированные с void программы.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-86905486925297209392007-05-28T11:49:00.000+04:002007-05-28T11:49:00.000+04:00int i = 5;i = ++i + ++i;Вопрос: Чему равно i?Этот ...<I>int i = 5;<BR/>i = ++i + ++i;<BR/>Вопрос: Чему равно i?</I><BR/><BR/>Этот <A HREF="http://bash.org.ru/quote/212679" REL="nofollow">код с bash.org.ru</A> пользуется популярностью, я смотрю :-)<BR/><BR/>Не знаю, правда, как это соотносится с возвращаемым значением функции main, но ответ <A HREF="http://alenacpp.blogspot.com/2005/11/sequence-points.html" REL="nofollow">здесь</A>.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-52517632423683310682007-05-28T06:34:00.000+04:002007-05-28T06:34:00.000+04:00int i = 5;i = ++i + ++i;Вопрос: Чему равно i?int i = 5;<BR/>i = ++i + ++i;<BR/>Вопрос: Чему равно i?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-7691127635945727542007-05-23T14:25:00.000+04:002007-05-23T14:25:00.000+04:00There is a reason why C assumed that every functio...There is a reason why C assumed that every function returns int, unless specified otherwise: it's the cheapest way to pass the value to the caller. On practically any implementation, return value is in the register. If the caller doesn't use the return value, it doesn't cost him anything.<BR/><BR/>Now, once you know this, you can see that the most convenient error handling mechanism in C is by using return values.<BR/><BR/>Now "main" is the function that is called by the run time library which is called by the operating system. And RTL and OS have its declaration as int main no matter how you declare main in your text.<BR/><BR/>So int main is expected to signal to the caller if the program execution was succesfull. If you don't return anything, the caller will get the garbage, whatever was in the register at the moment of the return.<BR/><BR/>So you should really get used to this idiom. It's very convenient too. Typically 0 means "everything ok" and other values specific error codes. Take a look at the simplest example:<BR/><BR/> f1 = fopen( <BR/> if ( !f1 ) return 1;<BR/> f2 = fopen( <BR/> if ( !f2 ) { fclose( f1); return 2; }<BR/> ...<BR/> return 0;<BR/><BR/>(Off topic: Thanks for a very good blog, I often find interesting stuff here)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-43878836998823334212007-05-22T21:37:00.000+04:002007-05-22T21:37:00.000+04:00Да какая разница? Тяжело написать int и return 0? ...Да какая разница? Тяжело написать int и return 0? Не понимаю я вас. =\<BR/><BR/>PS: Не помню себя ни разу, чтобы писал void main.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-33792673828462575952007-05-22T14:54:00.000+04:002007-05-22T14:54:00.000+04:00Фундаментальный вы вопрос затронули, барышня. А во...Фундаментальный вы вопрос затронули, барышня. А вообще может, да, сам видел!Unknownhttps://www.blogger.com/profile/02119933244428033894noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-51619313142230209602007-05-22T11:48:00.000+04:002007-05-22T11:48:00.000+04:00...чтобы вообще не задумываться...и сосредоточитьс...<I>...чтобы вообще не задумываться...и сосредоточиться...</I><BR/><BR/>Неужели <B>int</B> отвлекает больше чем <B>void</B>? Даже букв меньше :Р,<BR/>в примере можно в конце поставить:<BR/><BR/><B><BR/>// Комментарий,<BR/>// в котором будет все ясно.<BR/>return 0;</B>Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-10303035.post-46929274773641305042007-05-21T16:26:00.000+04:002007-05-21T16:26:00.000+04:00Как правило начинающие пользователи как раз учатся...<I>Как правило начинающие пользователи как раз учатся на этих примерах и привыкают к тому, что возвращать совершенно не обязательно.</I><BR/><BR/>Все же учиться только на синтетических примерах не есть хорошо. Обычно там слишком много допущений помимо возвращаемого значения функции main.<BR/><BR/><I>Насколько я помню достаточно поставить return 1 или вообще ничего не возвращать.</I><BR/>Кстати, да. Можно написать int main и вообще ничего не возвращать. Там по умолчанию return 0 по Стандарту.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-49597162342846163982007-05-21T15:31:00.000+04:002007-05-21T15:31:00.000+04:00gcc же при определении void main сругнется, но ско...<I>gcc же при определении void main сругнется, но скомпилит</I><BR/><BR/>$ cat test.cpp<BR/>void main()<BR/>{<BR/>}<BR/><BR/>$ g++-3.3 test.cpp<BR/>test.cpp:2: error: `main' must return `int'<BR/>$ g++-3.4 test.cpp<BR/>test.cpp:2: error: `main' must return `int'<BR/>$ g++-4.0 test.cpp<BR/>test.cpp:1: error: '::main' must return 'int'<BR/>$ g++-4.1 test.cpp<BR/>test.cpp:1: error: '::main' must return 'int'<BR/>$ g++-2.95 test.cpp<BR/><BR/>только старые версии компилятора проглотят такоеAlex Nekipelovhttps://www.blogger.com/profile/11644484550750096086noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-66224928944905213312007-05-21T15:20:00.000+04:002007-05-21T15:20:00.000+04:00чтобы вообще не задумываться о возвращаемом значен...<I>чтобы вообще не задумываться о возвращаемом значении и сосредоточиться на том аспекте для которого этот пример пишется.</I><BR/><BR/>Как правило начинающие пользователи как раз учатся на этих примерах и привыкают к тому, что возвращать совершенно не обязательно. А потом они пишут программы, которые ничего не возвращают. И как в этом случае должна работать конструкция <BR/><BR/>$ newprog && echo ok<BR/><BR/>или<BR/><BR/>$ newprog || echo false<BR/><BR/>?Alex Nekipelovhttps://www.blogger.com/profile/11644484550750096086noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-15374925293999541032007-05-21T13:04:00.000+04:002007-05-21T13:04:00.000+04:00Насколько я помню достаточно поставить return 1 ил...Насколько я помню достаточно поставить return 1 или вообще ничего не возвращать. gcc же при определении void main сругнется, но скомпилит.norguhtarhttps://www.blogger.com/profile/01590300726098472855noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-27584894435955935012007-05-21T12:27:00.000+04:002007-05-21T12:27:00.000+04:00а зачем делать его void? В синтетических примерах,...<I>а зачем делать его void? </I><BR/><BR/>В синтетических примерах, чтобы вообще не задумываться о возвращаемом значении и сосредоточиться на том аспекте для которого этот пример пишется.Alenahttps://www.blogger.com/profile/09389124127364799922noreply@blogger.comtag:blogger.com,1999:blog-10303035.post-77299858701448483002007-05-21T12:00:00.000+04:002007-05-21T12:00:00.000+04:00а зачем делать его void? всё-таки это как-никак сп...а зачем делать его void? всё-таки это как-никак способ сигнализировать ОС (или запускающему скрипту) об удачности или неудачности выполнения программы…<BR/><BR/>вот тут, кстати, есть разбор стандартов по этой теме: http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1044841143&id=1043284376Alexey Zakhlestinhttps://www.blogger.com/profile/10602140637518703433noreply@blogger.com