«K & R C» относится к языку, определенному в 1978 году первым изданием Kernighan & Книга Ричи «Язык программирования C».
В K & R (то есть, pre-ANSI) C объекты могут быть объявлены без явного типа и по умолчанию будут иметь тип int
. Это восходит к языкам предков C, B и BCPL.
main(a,b,c,d){
printf("%d", d);
}
Это почти эквивалентно:
int main(int a, int b, int c, int d) {
printf("%d", d);
}
старый синтаксис остается легальным, но устаревшее в ANSI C (1989) и ISO C (1990), но стандарт 1999 ISO C выронил " неявное int "(при сохранении декларации старого стиля и синтаксиса определения).
Обратите внимание, что я сказал, что это почти эквивалент. Это по сути то же самое, если рассматривать как определение, но в качестве декларации он не предоставляет информацию о типе параметров. При определении старого стиля вызов с неправильным числом или типами аргументов не нужно диагностировать; это просто неопределенное поведение. С видимым прототипом несогласованные аргументы запускают диагностику времени компиляции - и, когда это возможно, аргументы неявно преобразуются в тип параметра.
И поскольку это определение main
, есть еще одна проблема. Стандарт определяет только две формы для main
(один без аргументов и один с двумя аргументами, argc
и argv
). Реализация может поддерживать другие формы, но одна из четырех аргументов int
вряд ли будет одной из них. Поэтому поведение программы не определено. На практике, вероятно, что d
будет иметь некоторую стоимость мусора при первоначальном вызове.(И да, рекурсивный вызов main
разрешено в C, но вряд ли когда-либо хорошая идея.)
foo(a,b){
a = 2;
b = 'z';
}
Это почти эквивалентно:
int foo(int a, int b) {
a = 2;
b = 'z';
}
(И заметьте, что 'z'
имеет тип int
, а не тип char
)
И снова, старая форма не дает вам параметры проверки типа, поэтому вызов, как:.
foo("wrong type and number of arguments", 1.5, &foo);
не нужно диагностировать.
Практический результат: полезно знать, как K & Значения функций и определения функций R-стиля. Есть еще старый код, который их использует, и они все еще легальны (но устаревают) даже в C2011 (хотя без правила «неявного int»). Но нет почти никаких оснований, чтобы написать код, который использует их (если вы застряли, используя очень старый компилятор, но это редко и становится более редким.)
Но я могу заверить вас, я не буду использовать такой синтаксис в программировании на языке C.
Отлично!
Каковы предупреждения, которые вы получаете? Было бы полезно попытаться ответить на ваш вопрос. – Glenn
@Glenn Извините, никаких предупреждений, связанных с типами – P0W
Бонус: попробуйте вызвать 'foo (« this »,« should not »,« work »)'. – nneonneo