Зачем вам предшествовать функции main() в C с типом данных?

Многие знакомы с мировой программой hello в C

#include <stdio.h>

main ()
{
    printf ("hello world");
    return 0;

}

Почему некоторые предшествуют функции main() с int, как в:

int main()

Кроме того, я видел слово "void", введенное внутри(), как в:

int main(void)

Кажется, что это лишний набор текста, но, может быть, это лучшая практика, которая выплачивает дивиденды в других ситуациях?

Также, зачем предшествовать main() с int, если вы возвращаете строку символов? Во всяком случае, можно было бы ожидать:

char main(void)

Я тоже туман, почему мы возвращаем 0 в конце функции.

Ответ 1

В C89

было допустимо следующее:
main() {
  return 0;
}

Но в современном C (C99) это больше не допускается, потому что вам нужно явно указывать тип переменных и возвращаемый тип функций, поэтому он становится

int main() {
  return 0;
}

Кроме того, законно опускать return 0 в современном C, поэтому законно писать

int main() {

}

И поведение выглядит так, как будто оно возвращается 0.

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

void f();
 /* defined as  void f(int a) { } later in a different unit */

int main() {
  f("foo");
}

Вызов f вызывает поведение undefined, потому что компилятор не может проверить тип аргумента в отношении того, что f ожидает в других модулях. Если бы вы записали его с помощью void или int, компилятор знал бы

void f(int); /* only int arguments accepted! */

int main(void) {
  f("foo"); /* 'char*' isn't 'int'! */
}

Итак, для main это просто хорошая привычка ставить void, так как это хорошо сделать в другом месте. В C вам разрешено рекурсивно вызывать main, и в этом случае такие различия могут даже иметь значение.

К сожалению, только несколько компиляторов поддерживают современный C, поэтому на многих компиляторах C вы можете получить предупреждения для использования современных функций C.

Кроме того, вы можете видеть программы, объявляющие main, чтобы возвращать разные вещи, чем int. Такие программы могут сделать это, если они используют автономную реализацию C. Такие реализации C не налагают никаких ограничений на main, поскольку они даже не знают или не требуют такой функции в первую очередь. Но для того, чтобы иметь общий и портативный интерфейс к точке входа в программу, спецификация C требует строго соответствующих программ для объявления main с типом возвращаемого значения int и требует, чтобы хостинговые реализации C принимали такие программы.

Ответ 2

Функция main возвращает целочисленный код состояния, который сообщает операционной системе, успешно ли завершилась программа.
return 0 указывает на успех; возврат любого другого значения указывает на сбой.

Так как это целое число, а не строка, оно возвращает int, а не char или char*. (Вызов printf не имеет ничего общего с возвратом из функции)

Старые версии C позволяют использовать тип возврата по умолчанию int.
Однако лучше указать тип возвращаемого значения.

В C (в отличие от С++) функция, которая не принимает никаких параметров, объявляется как int myFunc(void)

Ответ 3

Он назвал статус выхода. Когда программа закончится, вы хотите, чтобы вызывающий узнал, как ваша программа вышла. Если он выйдет нормально, вы вернетесь 0 и т.д.

Здесь, где вы можете узнать больше о статусах выхода.

Ответ 4

Почему некоторые предшествуют функции main() с int, как в:

В C (C 89 все равно, что вы, похоже, ссылаетесь) функции возвращают int по умолчанию, если им не предшествует какой-либо тип данных. Предшествующее ему значение int в конечном счете является вопросом предпочтения.

Кроме того, я видел слово "void", введенное внутри(), как в:

В основном это зависит от предпочтений, однако эти два отличаются друг от друга:

f(void) означает, что функция f принимает аргументы zero, а f() означает, что функция f принимает an unspecified number of arguments.

f(void) - это правильный способ объявить функцию, которая не принимает аргументов в C.

Кажется, что это лишний набор текста, но, может быть, это лучшая практика, которая выплачивает дивиденды в других ситуациях?

Преимущество - это ясность. Если вы собираетесь утверждать, что меньшее набрав хорошее, то что вы думаете о том, чтобы назвать все ваши функции, переменные и файлы и все с максимально возможным количеством символов?

Также, зачем предшествовать main() с int, если вы возвращаете строку символов? Во всяком случае, можно было бы ожидать:

char main (void)

Что? почему в мире вы бы вернули строку символов из main? Нет абсолютно никаких оснований для этого...

Кроме того, ваше объявление main возвращает символ, а не строку символов.

Я тоже туман, почему мы возвращаем 0 в конце функции.

Программа возвращает значение операционной системе, когда оно заканчивается. Это значение может быть использовано для информирования ОС о некоторых вещах. Например, ваш вирус-сканер может вернуть 1, если обнаружен вирус, 0, если вирус не был найден, и 2, если возникла некоторая ошибка. Обычно 0 означает, что ошибки не было, и все прошло хорошо.

Ответ 5

Обоснование этого заключалось в том, чтобы предоставить некоторую форму механизма отчетности об ошибках. Поэтому всякий раз, когда программа возвращает нулевое значение, это обычно означает, что он считает, что он успешно выполнил свою задачу. Для ненулевых значений программа по какой-то причине потерпела неудачу. Время от времени это число может соответствовать определенному сообщению об ошибке. Несколько системных API вызывают коды возврата возврата C, чтобы указать, была ли обработка успешной. Поскольку в C нет понятия исключения, это лучший способ узнать, были ли ваши звонки успешными или нет.

Ответ 6

В большинстве операционных систем используются коды выхода для приложений. Обычно 0 - это код выхода для успеха (как, приложение успешно завершено). Возвращаемое значение main - это то, что возвращается в ОС, поэтому main обычно возвращает целое число (и поскольку 0 - это успех, большинство программ C будут иметь "return 0;" в конце).

Ответ 7

"int" перед объявлением основной функции - это тип возвращаемого типа. То есть, функция возвращает целое число.

Из функции вы можете вернуть часть данных. Типично возвращать "0", если функция завершена успешно. Любое другое число, до 255 возвращается, если программа не выполнялась успешно, чтобы показать произошедшую ошибку.

То есть вы возвращаете 0 с типом данных int, чтобы показать, что программа выполнена правильно.

Ответ 8

Традиционно использовать int main(int argc, char * argv[]), потому что целочисленный возврат может указывать, как выполняется программа. Возврат 0 означает, что программа выполнена успешно, тогда как -1 указывает, что у нее был какой-то сбой. Обычно коды выхода будут очень специфичными и будут использоваться в качестве метода отладки, поскольку исключения (в смысле С++) не существуют в C.