Не нужна ли точка с запятой (';') после объявления функции в C++?
Я только недавно сдал промежуточный тест по программированию, и один из вопросов, который я ошибся, был следующим:
Точка с запятой (';') не требуется после объявления функции.
Правда или ложь.
Я выбрал "false" (и, пожалуйста, исправьте меня, если я ошибаюсь, потому что я чувствую, что схожу с ума), объявление функции - это то, что вы пишете перед определением (в верхней части кода), чтобы компилятор знал функцию позвонить еще до вызова, и определение функции является то, что делает функцию в целом.
То есть,
Декларация:
int func();
Определение:
int func() {
return 1;
}
Разве ответ на этот вопрос не должен быть ложным?
Ответы
Ответ 1
Может возникнуть ситуация, когда вы объявляете и определяете функцию за один шаг, т.е. если вы включаете определение функции в тот момент, когда вы объявляете ее. Технически, я полагаю, правда - это правильно. Но вопрос сформулирован так, что я бы ответил на него так же, как и вы.
Ответ 2
В дополнение к пункту "определение - это также декларация", законным является следующее: C++:
int f(), g();
Это объявляет две функции, f
и g
, как без аргументов, так и с возвращаемым типом int
, но определение f
не сопровождается (сразу) точкой с запятой. Точно так же это законно:
int f(), i = 42;
Но в этих случаях нельзя полностью опускать точку с запятой, поэтому было бы несколько удивительно, если бы они были взяты в качестве примера объявления без следующей точки с запятой. На самом деле, следующее незаконно:
void *p, f() {}
Помимо (простого) объявления функции, определение функции не может быть объединено с любым другим объявлением или определением для того же спецификатора типа. (Если бы это было законно, это определило бы и void *p
и void f() {}
.)
В любом случае, это, кажется, вопрос типа "гоча", который не должен быть в промежуточном тесте программирования.
(Кстати, пожалуйста, на самом деле не пишите такой код, как int f(), я = 42;
)
Ответ 3
В других ответах и комментариях упоминается несколько причин, по которым это ужасный, вводящий в заблуждение и плохо написанный вопрос. Но есть еще одна проблема, которую еще никто не определил. Вопрос в том:
Точка с запятой (';') не требуется после объявления функции. Правда или ложь.
Хорошо, давайте посмотрим на объявление функции:
int func(); /* */
/* ^ */
/* | */
/* That whitespace is "after the function declaration". */
Все это декларация. Объявление не является int func()
а затем следует a ;
, Объявление int func();
и затем следует пробел.
Итак, вопрос: нужна ли точка с запятой после объявления? Конечно, нет. Декларация уже содержит точку с запятой, которая завершила ее. Точка с запятой после объявления будет бессмысленной. Напротив, int func(); ;
int func(); ;
будет точка с запятой после объявления функции.
Вопрос был почти наверняка предназначен для того, чтобы задать вопрос "истина или ложь: последний токен в объявлении функции - это всегда точка с запятой". Но это не тот вопрос, который они написали, потому что автор теста не думал четко о проблеме.
Мой совет - вообще избегать тестов по языку программирования. Они довольно ужасны.
Интересный факт, пока мы на эту тему. В С# все это законно:
class C {}
class D {};
struct E {}
struct F {};
В С# объявление класса или структуры может заканчиваться точкой с запятой или нет по вашему усмотрению. Эта странная небольшая функция была добавлена в пользу программистов на C/C++, пришедших на С#, у которых в кончиках пальцев есть, что объявления типов заканчиваются бессмысленной точкой с запятой; команда разработчиков не хотела наказать их за эту привычку. :-)
Ответ 4
Вы также можете объявить такую функцию:
int func(){
return 1;
}
Утверждение очень неоднозначно. Правильный ответ должен быть: это зависит от того, как вы объявляете функцию.
В любом случае, я бы тоже выбрал false, и, может быть, вы можете сообщить об этом кому-нибудь.
Ответ 5
Точка с запятой (';') не требуется после объявления функции.
Правда или ложь.
Правда Точка с запятой не нужна после любого объявления. Ни после какого определения. Ни после какого-либо заявления.
Многие виды объявлений должны заканчиваться точкой с запятой, как указано в синтаксисе в разделе 7 [dcl.dcl]. Но больше нет необходимости писать второй после этого.
Ответ 6
Это зависит от того, объявляем мы или определяем функцию. Если мы объявляем функцию, нам нужно включить точку с запятой (;
), а если мы определяем функцию, точка с запятой не нужна.
Объявление выглядит так:
int add(int, int);
И определение таково:
int add(int a, int b)
{
// ...
}
Ответ 7
Жаль, что вопрос, который вы взяли, не говорит "сразу после". Мы могли бы, например, написать это:
int func() /* My function */ ;
Или я мог бы написать:
int func()
int a = 42;
В первом случае точка с запятой не сразу после объявления, но это будет нормально.
Во втором случае стоит точка с запятой "после" объявления, но не сразу после.
Я думаю, что Эрик Липперт имеет правильную идею в своем ответе.
Это как сказать "должен ли быть какой-то период после окончания предложения на английском?". Возможно, у предложения уже есть конец в конце (иначе это не было бы предложение), и поэтому не должно быть периода после предложения...
Ответ 8
Несмотря на то, что я согласен почти со всеми другими ответами, заявив, что вопрос сформулирован очень двусмысленно, и что ваш ответ технически правильный, позвольте мне дать другую точку зрения:
Вот как я их всегда называл:
void func(); // The function prototype
...
void func()
{
// The function definition
}
Я предполагаю, что вопрос был составлен с учетом этой терминологии.
Определение и декларация - это одно и то же понятие в моих глазах. "Я определяю x = y" == "Я объявляю x = y".
Но, конечно, существует большая разница между прототипом функции (сверху) и фактическим определением функции.
Ответ 9
Вы можете использовать ;
только для прототипов.
Ответ 10
Это довольно сложный вопрос, но они использовали слово объявление, которое означает что-то вроде этого:
int example();
Так что это правда в этом случае.
Если бы они использовали слово реализация, то это было бы неверно.
Ответ 11
Точка с запятой (;) используется для указания компилятору, что после этой точки с запятой (;) начинается новый оператор.
Поэтому я думаю, что точка с запятой (;) требуется только во время объявления функции. Так что, по мне, ответ будет верным.
Ответ 12
Когда функции определены перед main():
- Не нужно ставить точку с запятой, потому что функция уже определена
Когда функции определены после main():
- Нужна точка с запятой, потому что вы создаете прототип этой функции и сообщаете компилятору о выходе из функции.