Не нужна ли точка с запятой (';') после объявления функции в 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():

  • Нужна точка с запятой, потому что вы создаете прототип этой функции и сообщаете компилятору о выходе из функции.