Не нужна ли точка с запятой (';') после объявления функции в C ++? - PullRequest
0 голосов
/ 20 февраля 2019

Я только недавно прошел промежуточный тест по программированию, и один из вопросов, которые я ошибся, был следующим:

Точка с запятой (';') не нужна после объявления функции.

True или False.

Я выбрал "false" (и, пожалуйста, исправьте меня, если я ошибаюсь, потому что я чувствую, что схожу с ума), функция объявление - это то, что вы пишете перед определением (вверху кода), поэтому компилятор знает вызов функции еще до ее вызова, а функция Definition - это то, что составляет функцию в целом.

То есть

Декларация:

int func();

Определение:

int func() {
  return 1;
}

Не долженответ на это будет ложным?

Ответы [ 12 ]

0 голосов
/ 07 марта 2019

Когда функции определены перед main () :

  • Не нужно ставить точку с запятой , потому что функция уже определена

Когда функции определены после main () :

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

Точка с запятой (;) используется для указания компилятору, что после этой точки с запятой (;) начинается новый оператор.

Поэтому я думаю, что точка с запятой (;) требуется только во время объявления функции.Так что, по-моему, ответ будет верным.

0 голосов
/ 05 марта 2019

Это довольно сложный вопрос, но они использовали слово объявление , что означает что-то вроде этого:

int example();

Так что в этом случае это так.

Если бы они использовали слово реализация , тогда оно было бы ложным.

0 голосов
/ 22 февраля 2019

Точка с запятой (';') не требуется после объявления функции.

True или False.

True .Точка с запятой не нужна после любого объявления.Ни после какого определения.Ни после какого-либо оператора.

Многие виды объявлений должны заканчиваться точкой с запятой, как указано в синтаксисе в разделе 7 [dcl.dcl].Но после этого больше не нужно писать второй.

0 голосов
/ 25 февраля 2019

Вы можете использовать ; только для прототипов.

0 голосов
/ 22 февраля 2019

Жаль, что вопрос, который вы взяли, не говорит «сразу после».Например, мы могли бы написать это:

int func()  /* My function */ ;

Или я мог бы написать:

int func()
int a = 42;

В первом случае точка с запятой не сразу после объявления, ноэто было бы хорошо.

Во втором случае есть точка с запятой «после» объявления, но не сразу после.

Я думаю, что Эрик Липперт имеет правильную идею в его ответе.

Это все равно, что сказать «должен ли быть какой-нибудь период после окончания предложения на английском?».Возможно, предложение уже имеет точку в конце (иначе это не было бы предложение), и поэтому не должно быть периода после предложения ..

0 голосов
/ 22 февраля 2019

Несмотря на то, что я согласен почти со всеми другими ответами, заявив, что вопрос сформулирован очень двусмысленно, и что ваш ответ технически верен, позвольте мне дать другую точку зрения:

Вот как яЯ всегда звонил им:

void func();  // The function prototype

...

void func()
{
    // The function definition
}

Я предполагаю, что вопрос был составлен с учетом этой терминологии.

Определение и декларация - это одно и то же понятие в моих глазах.«Я определяю x = y» == «Я объявляю x = y».

Но, конечно, существует большая разница между прототипом функции (сверху) и фактическим определением функции.

0 голосов
/ 21 февраля 2019

Это зависит от того, объявляем мы или определяем функцию.Если мы объявляем функцию, нам нужно включить точку с запятой (;), а если мы определяем функцию, точка с запятой не нужна.

Объявление выглядит так:

int add(int, int);

И определение таково:

int add(int a, int b)
{
    // ...
}
0 голосов
/ 21 февраля 2019

В других ответах и ​​комментариях упоминается несколько причин, по которым это ужасный, вводящий в заблуждение и плохо написанный вопрос.Но есть еще одна проблема, которую еще никто не определил.Вопрос в следующем:

Точка с запятой (';') не нужна после объявления функции.Верно или неверно.

ОК, давайте посмотрим на объявление функции:

int func();       /* */
/*           ^       */
/*           |       */
/* That whitespace is "after the function declaration". */

Все это объявление .Объявление не int func(), а затем , за которым следует a ;.Объявление int func();, за которым следует пробел.

Итак, вопрос в том: нужна ли точка с запятой после объявления ?Конечно, нет. В декларации уже есть точка с запятой, которая заканчивает его. Точка с запятой после объявления будет бессмысленной.Напротив, int func(); ; будет точкой с запятой после объявления функции .

Вопрос почти наверняка был предназначен , чтобы задать вопрос "истина или ложь: последниймаркер в объявлении функции - это всегда точка с запятой. «Но это не тот вопрос, который они написали, потому что автор теста не задумывался о проблеме».

Мой совет - вообще избегать тестов по языку программирования.Они довольно ужасные.


Забавный факт, пока мы обсуждаем эту тему.В C # все они допустимы:

class C {}
class D {};
struct E {}
struct F {};

В C # объявление класса или структуры может заканчиваться точкой с запятой или нет по вашему усмотрению.Эта странная небольшая функция была добавлена ​​в пользу программистов на C / C ++, пришедших на C #, которые имеют под рукой, чтобы объявления типов заканчивались бессмысленной точкой с запятой;команда разработчиков не хотела наказать их за эту привычку.: -)

0 голосов
/ 20 февраля 2019

В дополнение к «определению является также объявлением», C ++ допустимо следующее:

int f(), g();

Это объявляет две функции, f и g, как без аргументов, так и стип возврата int, но определение f не сопровождается (сразу) точкой с запятой.Аналогично, это законно:

int f(), i = 42;

Но в этих случаях нельзя использовать точку с запятой полностью, поэтому было бы несколько удивительно, если бы любой из них был взят в качестве примера объявления без следующей точки с запятой,На самом деле, следующее недопустимо:

void *p, f() {}

Кроме (простого) объявления функции, функция определение не может быть объединена с любым другим объявлением или определением для того же тип спецификатор .(Если бы это было законно, это определило бы и void *p, и void f() {}.)

В любом случае, это, кажется, вопрос типа "гоча", который не должен быть в промежуточном программированииtest.

(О, кстати, пожалуйста, на самом деле не пишите код вроде int f(), i = 42;.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...