Я только недавно сдал промежуточный тест по программированию, и один из вопросов, который я ошибся, был следующим:
Точка с запятой (';') не требуется после объявления функции.
Правда или ложь.
Я выбрал «false» (и, пожалуйста, исправьте меня, если я ошибаюсь, потому что я чувствую, что схожу с ума), объявление функции - это то, что вы пишете перед определением (вверху кода), чтобы компилятор знал функцию даже позвонить перед вызовом, а функция определения является то , что делает функцию в целом.
То есть,
Декларация:
int func();
Определение:
int func() {
return 1;
}
Разве ответ на этот вопрос не должен быть ложным?
c++
function
syntax
declaration
логан
источник
источник
Ответы:
Может возникнуть ситуация, когда вы объявляете и определяете функцию за один шаг, т.е. если вы включаете определение функции в тот момент, когда вы объявляете ее. Так что технически я полагаю , правда , это правильно. Но вопрос сформулирован так, что я бы ответил на него так же, как и вы.
источник
В дополнение к «определение также является декларацией», допустим C ++:
Это объявляет две функции,
f
причемg
оба без аргументов и с типом возвратаint
, но за определениемf
не следует (сразу) точка с запятой. Точно так же это законно:Но в этих случаях нельзя полностью опускать точку с запятой, поэтому было бы несколько удивительно, если бы они были взяты в качестве примера объявления без следующей точки с запятой. На самом деле, следующее незаконно:
Помимо (простого) объявления функции, определение функции не может быть объединено с любым другим объявлением или определением для того же спецификатора типа . (Если бы это было законно, это определило бы и a
void *p
и avoid f() {}
.)В любом случае, это, кажется, вопрос типа «гоча», который не должен быть в промежуточном тесте программирования.
(О, кстати, пожалуйста, на самом деле не пишите код как
int f(), i = 42;
.)источник
typedef int fooProc(int); fooProc a,b.c.d.e;
я не уверен, почему стандартные заголовки для компиляторов на основе дисковода гибких дисков не сделали этого в день, так как я думаю, что это позволило бы значительно уменьшить размер заголовочных файлов и, следовательно, ускорить их обработку.int f(int(&g)(),int(*h)()){return g()+h();}
что здесь есть три объявления функций, одно из которых сопровождается открытой фигурной скобкой, другое - запятой, а третье - закрывающей скобкой.int f(stuff)
. Даже в области видимости функции,g
представляет собой автоматические переменный тип ссылки на функцию , иh
является указателем на функцию .В других ответах и комментариях упоминается несколько причин, по которым это ужасный, вводящий в заблуждение и плохо написанный вопрос. Но есть еще одна проблема, которую еще никто не определил. Вопрос в том:
Хорошо, давайте посмотрим на объявление функции:
Все это декларация . Декларация не
int func()
затем следуют;
. Объявлениеint func();
и затем следует пробел.Итак, вопрос: нужна ли точка с запятой после объявления ? Конечно нет. Декларация уже содержит точку с запятой, которая завершила ее. Точка с запятой после объявления будет бессмысленной. Напротив,
int func(); ;
будет точка с запятой после объявления функции .Вопрос был почти наверняка предназначен для того, чтобы задать вопрос «истина или ложь: последний токен в объявлении функции - это всегда точка с запятой». Но это не тот вопрос, который они написали, потому что автор теста не думал четко о проблеме.
Мой совет - вообще избегать тестов по языку программирования. Они довольно ужасны.
Интересный факт, пока мы на эту тему. В C # все это законно:
В C # объявление класса или структуры может заканчиваться точкой с запятой или нет по вашему усмотрению. Эта странная небольшая функция была добавлена в пользу программистов на C / C ++, пришедших на C #, которые имеют под рукой, чтобы объявления типов заканчивались бессмысленной точкой с запятой; команда разработчиков не хотела наказать их за эту привычку. :-)
источник
Вы также можете объявить такую функцию:
Утверждение очень неоднозначно. Правильный ответ должен быть: это зависит от того, как вы объявляете функцию.
В любом случае, я бы тоже выбрал false, и, может быть, вы можете сообщить об этом кому-нибудь.
источник
Правда . Точка с запятой не нужна после любого объявления. Ни после какого определения. Ни после какого-либо заявления.
Многие виды объявлений должны заканчиваться точкой с запятой, как указано в синтаксисе в разделе 7 [dcl.dcl]. Но больше нет необходимости писать второй после этого.
источник
Это зависит от того, объявляем мы или определяем функцию. Если мы объявляем функцию, нам нужно включить точку с запятой (
;
), а если мы определяем функцию, точка с запятой не нужна.Объявление выглядит так:
И определение таково:
источник
Хотя я согласен почти со всеми остальными ответами, заявив, что вопрос сформулирован очень двусмысленно, и что ваш ответ технически верен, позвольте мне дать другую точку зрения:
Вот как я их всегда называл:
Я предполагаю, что вопрос был составлен с учетом этой терминологии.
Определение и декларация - это одно и то же понятие в моих глазах. «Я определяю x = y» == «Я объявляю x = y».
Но, конечно, есть большая разница между прототипом функции (сверху) и фактическим определением функции.
источник
void func();
в точности эквивалентныvoid func(void);
. Это очень отличается от C , гдеvoid func();
компилятор ничего не говорит об аргументах и не то же самое, что иvoid func(void);
. Более поздний прототип или определение являются хорошей идеей, в противном случае вызывающая сторона должна применять стандартные аргументы arg (например, float -> double и узкие целочисленные типы кint
. Те же правила, что и для args для функций с переменными числами.)Жаль, что вопрос, который вы взяли, не говорит «сразу после». Мы могли бы, например, написать это:
Или я мог бы написать:
В первом случае точка с запятой не сразу после объявления, но это будет нормально.
Во втором случае стоит точка с запятой «после» объявления, но не сразу после.
Я думаю, что Эрик Липперт имеет правильную идею в своем ответе .
Это все равно что сказать «должен ли быть какой-нибудь период после окончания предложения на английском?». Возможно, предложение уже имеет точку в конце (иначе это не было бы предложение), и поэтому после предложения не должно быть периода .
источник
int func() int a=42;
не компилируется Вам нужна запятая, а не другаяint
. См. Ответ @ Арне, опубликованный за день до этого. Единственное новое в этом ответе - последний абзац с аналогией с английскими предложениями.Вы можете использовать
;
только для прототипов.источник
Это довольно сложный вопрос, но они использовали слово объявление, которое означает что-то вроде этого:
Так что это правда в этом случае.
Если бы они использовали слово « реализация», то оно было бы ложным.
источник
Точка с запятой (;) используется для указания компилятору, что после этой точки с запятой (;) начинается новый оператор.
Поэтому я думаю, что точка с запятой (;) требуется только во время объявления функции. Так что, по мне, ответ будет верным.
источник
Когда функции определены перед main () :
Когда функции определены после main () :
источник