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;
Что ж, если вам нужен 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 (Определения функций), где грамматика для определений функций указывает, что «спецификаторы объявления» являются необязательными, а в примерах говорится:
Примеры:
В следующем:
extern int max (int a, int b) { вернуть a> b? а: б; }
extern
- это спецификатор класса хранилища, аint
- это спецификатор типа (каждый из которых может быть опущен, поскольку это значения по умолчанию) ...
Да, в C89 (исходный стандарт C), если функция объявлена без возвращаемого типа, предполагается, что она возвращает int
. C99 требует явного возвращаемого типа для всех функций.
Кроме того, существует небольшая разница (по крайней мере, в объявлениях) между main () и main (void) -
main()
- это функция (неявно), возвращающая int и принимающая не указано количество аргументов
main(void)
принимает без аргументов.
Версия K&R, которая у меня есть, была напечатана в 1988 году. Стандарт к тому времени еще не вышел, так что есть некоторые несоответствия. Однако большая часть 2-го издания соответствует стандарту C89.
Я нашел текстовую версию стандарта C89 (УРА для Google); он говорит:
"Запуск программы"
Функция, вызываемая в программе запуск называется основным. В реализация не объявляет прототипа для этой функции. Это можно определить без параметров:
int main (void) {/*...*/}
или с двумя параметрами (см. здесь как argc и argv, хотя любой могут использоваться имена, так как они местные к функции, в которой они объявлен):
int main (int argc, char * argv []) {/*...*/}