правильно объявление основного () функционирует в ANSI C [дубликат]

Delphi

function IsPalindrome(const s: string): boolean;
var
  i, j: integer;
begin
  Result := false;
  j := Length(s);
  for i := 1 to Length(s) div 2 do begin
    if s[i] <> s[j] then
      Exit;
    Dec(j);
  end;
  Result := true;
end;
9
задан Georg Fritzsche 19 June 2010 в 14:37
поделиться

4 ответа

Что ж, если вам нужен ANSI C, тогда стандарт верен по определению.

В C89 / C90 подразумевается возвращаемый тип int , поэтому определение K&R будет приемлемым.

В C99 это уже не так.

Стандарт C90 имеет следующую формулировку (5.1.2.2.1 Запуск программы), которая очень похожа на формулировку C99 (вероятно, наиболее часто в нем используется менее сильное «может» вместо «должна»):

Функция, вызываемая при запуске программы, называется main . Реализация не объявляет прототипа для этой функции. Его можно определить без параметров:

 int main (void) {/ * ... * /}

или с двумя параметрами (называемыми здесь argc и argv , хотя можно использовать любые имена, поскольку они являются локальными для функции, в которой они объявлены):

 int main (int argc, char * argv []) {/ * ... * /}

Если они определены, параметры функции main должны подчиняться следующим ограничениям:

[и т. Д. ...]

В этом разделе нет ничего прямо о том, что отказ от возвращаемого типа приведет к тому, что по умолчанию он будет иметь значение int .

Честно говоря, мне трудно найти, где именно это поведение определяется стандартом. Самое близкое, что я могу найти, - это 6.7.1 (Определения функций), где грамматика для определений функций указывает, что «спецификаторы объявления» являются необязательными, а в примерах говорится:

Примеры:

  1. В следующем:

      extern int max (int a, int b)
     {
    вернуть a> b? а: б;
     }
    

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

14
ответ дан 4 December 2019 в 10:32
поделиться

Да, в C89 (исходный стандарт C), если функция объявлена ​​без возвращаемого типа, предполагается, что она возвращает int . C99 требует явного возвращаемого типа для всех функций.

3
ответ дан 4 December 2019 в 10:32
поделиться

Кроме того, существует небольшая разница (по крайней мере, в объявлениях) между main () и main (void) -

main()

- это функция (неявно), возвращающая int и принимающая не указано количество аргументов

main(void)

принимает без аргументов.

3
ответ дан 4 December 2019 в 10:32
поделиться

Версия K&R, которая у меня есть, была напечатана в 1988 году. Стандарт к тому времени еще не вышел, так что есть некоторые несоответствия. Однако большая часть 2-го издания соответствует стандарту C89.

Я нашел текстовую версию стандарта C89 (УРА для Google); он говорит:

"Запуск программы"

Функция, вызываемая в программе запуск называется основным. В реализация не объявляет прототипа для этой функции. Это можно определить без параметров:

  int main (void) {/*...*/}

или с двумя параметрами (см. здесь как argc и argv, хотя любой могут использоваться имена, так как они местные к функции, в которой они объявлен):

  int main (int argc, char * argv []) {/*...*/}
0
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: