Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
b2r2
0 / 0 / 1
Регистрация: 02.10.2015
Сообщений: 6
1

Зачем функции main тип void?

16.04.2016, 21:45. Просмотров 1359. Ответов 10
Метки нет (Все метки)

Собственно сабж. Просто не понятно, мы в майне пишем return 0, а для этого вроде бы как не нужен тип integer и легко можно обойтись short или signed(unsigned) char, ну или же можем вообще не возвращать и писать просто void.
В общем не понимаю я зачем выделять 4 байта для мейна
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2016, 21:45
Ответы с готовыми решениями:

Зачем нужны аргументы в функции main
Приветствую всех... кто нибудь мне может подсказать зачем нужны аргументы в функции main() и зачем...

Чем отличается int main от void main?
Мне нравится int main можно её всегда использовать а про void main забыть?

Возможна ли инициализация связного списка в функции void (void)?
Всем привет. В связи с полученным в универе заданием возник вопрос, а возможна ли в принципе...

Что означает void в скобках у Main?
Здравствуйте. Можно как ребёнку объяснить мне в языке C, что означает, если у main() есть в скобках...

Зачем приведение, чему равно (void *) 4
https://github.com/nginx/nginx/blob/master/src/http/ngx_http.c (1996) type->value = (void *) 4;

10
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4854 / 2497 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
16.04.2016, 22:03 2
Цитата Сообщение от b2r2 Посмотреть сообщение
В общем не понимаю я зачем выделять 4 байта для мейна
Что-то у вас путаница какая-то.

Функция main всегда имеет тип возврата int, int и только int. При этом писать return 0 внутри функции main совсем не обязательно - она и так автоматически вернет 0, если вы позволите ей нормально завершиться.

void main мы не пишем никогда - спецификация языка С не поддерживает такого варианта функции main. Функция main всегда имеет тип возврата int.

А причина того, почему main возвращает int заключается в том, что исторически "окружающий мир" ("host", например, вызывающая ОС) ожидает от вашей программы какого-то кода возврата, который традиционно с стороны С программы выражается типом int.

Формально, язык С поддерживает и реализации без "окружающего мира" ("свободностоящие реализации", "freestanding implementations"). В таких реализациях подобных требований на main не накладывается, но там и вообще нет никакой особенной функции main.

А что вы имеете в виду под "выделять 4 байта" ме совсем не понятно. Выделять где? Как по вашему "выделяются" возвращаемые значения функций?
3
b2r2
0 / 0 / 1
Регистрация: 02.10.2015
Сообщений: 6
16.04.2016, 22:17  [ТС] 3
Что-то вроде бы стало понятно
Но опять же, что мне мешает написать например short main(void), а потом вернуть 0, или же void main(void) ?
Про байты писал, так как под тип int выделяется 4 байта, а значит и для функции мейн так же выделяется 4 байта. Или я всё напутал?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4854 / 2497 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
16.04.2016, 22:37 4
Цитата Сообщение от b2r2 Посмотреть сообщение
о опять же, что мне мешает написать например short main(void), а потом вернуть 0, или же void main(void) ?
Мешают вам требования языка С, которые, во-первых, заставят компилятор ткнуть вас носом в нарушение этих требований

C
1
short main() { return 0; }
Код
> clang -std=c11 -pedantic-errors main.c
main.cpp:1:1: error: 'main' must return 'int'
short main() { return 0; }
^~~~~
int
1 error generated.
Код
> gcc -std=c11 -pedantic-errors main.c
main.cpp:1:7: error: return type of 'main' is not 'int' [-Wmain]
 short main() { return 0; }
       ^
А также, во-вторых, тот факт, что программа, нарушающая требования спецификации языка имеет неопределенное поведение, даже если она вдруг как-то скомпилировалась компилятором. Т.е. даже если компилятор в такой ситуации вам никак не "помешает", язык С никаких гарантий по поводу вашей программы вам не дает.
1
16.04.2016, 22:37
Evg
Эксперт CАвтор FAQ
19893 / 7524 / 574
Регистрация: 30.03.2009
Сообщений: 20,984
Записей в блоге: 30
16.04.2016, 23:01 5
Цитата Сообщение от b2r2 Посмотреть сообщение
мы в майне пишем return 0
Ну напиши "return 10" или "return 255" или "return 12345678", если тебя так мучает, что ты возвращаешь ноль, для записи которого достаточно 1 бита
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
19.04.2016, 08:44 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
При этом писать return 0 внутри функции main совсем не обязательно - она и так автоматически вернет 0, если вы позволите ей нормально завершиться.
Да ну?! По стандарту ANSI C 89 она вернёт последнее вычесленное значение, что может оказаться проблемой при выполнении "цепочки" команд:
Код
$ wrong_returned_code_program && some_another_command
вторая команда не будет выполнена, а могла бы, еслиб первая 0 вернула. В прочем в ANSI C 99 это "исправлено" и за отсутствием return 0; main и в правду 0 возвращает. Надо только не забывать об этом, а лучше просто взять в привычку 0 возвращать при удачном окончании программы.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4854 / 2497 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
19.04.2016, 08:50 7
Цитата Сообщение от easybudda Посмотреть сообщение
Да ну?! Она вернёт последнее вычесленное значение, что может оказаться проблемой при выполнении "цепочки" команд:
Хм... Уже в третий раз за последние несколько дней эта тема всплывает.

Начиная с С99 язык гарантирует, что выполнение main до финальной закрывающей скобки, без явного return, эквивалентно return 0. В стандартном С++ так было всегда. В стандартном С так стало с С99. И только в С89/90 возвращаемое значение main в такой ситуации было не определено.

Истории про "последнее вычисленное значение" мы все слышали, но к main это не относится.
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
19.04.2016, 09:20 8
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В стандартном С так стало с С99. И только в С89/90 возвращаемое значение main в такой ситуации было не определено.
Ага, стало, только этот момент всё-таки стоит оговаривать.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В стандартном С++ так было всегда.
Это здесь при чём?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4854 / 2497 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
19.04.2016, 09:51 9
Цитата Сообщение от easybudda Посмотреть сообщение
Ага, стало, только этот момент всё-таки стоит оговаривать.
В 2016 году, после С99 и С11, оговаривать этот момент?! Нет, это ни в какие ворота не лезет. Как раз таки специально оговаривать надо было бы, если бы речь шла о С89/90.
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
19.04.2016, 10:06 10
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В 2016 году, после С99 и С11, оговаривать этот момент?! Нет, это ни в какие ворота не лезет. Как раз таки специально оговаривать надо было бы, если бы речь шла о С89/90.
Вы это производителям gcc расскажите, а то они -std=gnu11 по умолчанию не так давно приделали...
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4854 / 2497 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
19.04.2016, 10:13 11
Цитата Сообщение от easybudda Посмотреть сообщение
Вы это производителям gcc расскажите, а то они -std=gnu11 по умолчанию не так давно приделали...
Они в курсе. Они, небось, не от хорошей жизни. GCC в любом случае - странный пример, ибо их умолчательный язык не был стандартнчм тогда, и не является стандартным сейчас.
0
19.04.2016, 10:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2016, 10:13

Указатель типа void: зачем они нужны?
Здравствуйте! Начал изучать Язык С, в книжке написано: Только не понятно зачем нужны такие...

Использование типа void в качестве возвращаемого значения функцией main
Здравствуйте. Надеюсь получить внятный ответ на то, почему все категорически рекомендуют...

Прошу объяснить, почему перед функцией main, которая ничего не возращает, мы должны писать int, а не void?
Как пример: }#include <stdio.h> * ... main() { float fahr, celsius; * int lower, upper,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru