2010-05-23 2 views
13

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

#include <stdio.h> 

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

} 

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

int main() 

Кроме того, я видел слово «пустота 'вошел внутри(), как в:

int main(void) 

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

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

char main(void) 

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

+1

Нет. Во-первых, это C, а не C++, и для другого он спрашивает, зачем вообще нужен тип данных и возвращаемый оператор. – Zarel

ответ

11

было действительно в 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 вызывает неопределенное поведение, потому что компилятор не может проверить тип аргумента против того, что 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 реализаций для принятия таких программ.

+0

Это помогает узнать о различных реализациях C, таких как C99. Это объясняет, почему я вижу другой код в старых книгах. Я купил Программирование Кочана в C, чтобы помочь мне узнать C. Спасибо всем ответы на переполнение стека, поскольку вы все собрали для меня кусочки. – Milktrader

13

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

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

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

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

+1

Исправить, за исключением «символьного кода». – dan04

+0

@ dan04: Я имел в виду _status_; Я понятия не имею, почему я написал характер. – SLaks

+3

main - _not_ special wrt, не допускающий тип возврата. Скорее C примет тип возврата int, если он не указан. –

5

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

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

1

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

2

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

1

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

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

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

1

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

+1

Не ** char \ * [] argv **, но ** char \ * argv [] ** – mosg

3

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

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

Кроме того, я видел слово «пустота» вошел внутри(), как в:

Это также вопрос предпочтения в основном, однако эти два совершенно разные:

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

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

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

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

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

символ основной (аннулируются)

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

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

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

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

+0

спасибо за объяснение f() по сравнению с f (void) – Milktrader

Смежные вопросы