Czy średnik ( ' ;') nie jest potrzebny po deklaracji funkcji w C++?

Niedawno przystąpiłem do testu programowania pośredniego i jedno z pytań, które się pomyliłem było następujące:

Średnik ( ' ;') nie jest potrzebny po deklaracji funkcji.

Prawda czy fałsz.

Wybrałem "false" (i proszę mnie poprawić, jeśli się mylę, ponieważ czuję, że szaleję), funkcja deklaracja jest tym, co piszesz przed definicją (na górze kodu), więc kompilator zna wywołanie funkcji przed nawet wywołanie, a definicja jest tym, co składa się na funkcję jako całość.

Tzn.,

Deklaracja:

int func();

Definicja:

int func() {
  return 1;
}
Czy odpowiedź nie powinna być fałszywa?
Author: Peter Mortensen, 2019-02-20

12 answers

Możesz mieć sytuację, w której zadeklarujesz i zdefiniujesz funkcję w jednym kroku, tzn. jeśli włączysz definicję funkcji w punkcie, w którym ją deklarujesz. Więc technicznie przypuszczam, że prawda jest poprawna. Ale pytanie jest sformułowane w taki sposób, że odpowiedziałbym tak, jak ty.

 161
Author: jwismar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-20 16:23:02

W języku C++nie ma znaczenia, czy dana definicja jest deklaracją, czy też deklaracją.]}

int f(), g();

To deklaruje dwie funkcje, f i g, Zarówno bez argumentów, jak i z typem zwracanym int, ale definicja f nie jest poprzedzona (natychmiast) średnikiem. Podobnie, jest to legalne:

int f(), i = 42;

Ale w tych przypadkach nie wolno całkowicie pomijać średnika, więc byłoby nieco zaskakujące, gdyby któryś z nich był brany za przykład deklaracja bez następującego średnika. W rzeczywistości, następujące są nielegalne:

void *p, f() {}

Inna niż (zwykła) deklaracja funkcji, definicja funkcji nie może być łączona z żadną inną deklaracją lub definicją tego samego typu . (Gdyby było to legalne, definiowałoby zarówno a void *p, jak i a void f() {}.)

W każdym razie wydaje się, że jest to pytanie typu "gotcha", które nie powinno być w teście programowania pośredniego.

(Oh, by the way, proszę nie pisać kodu jak int f(), i = 42;.)

 147
Author: Arne Vogel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-20 17:35:15

Inne odpowiedzi i komentarze wskazują na kilka z wielu sposobów, że jest to okropne, mylące i źle napisane pytanie. Ale jest jeszcze jeden problem, którego nikt inny jeszcze nie zidentyfikował. Pytanie brzmi:

Średnik ( ' ;') nie jest potrzebny po deklaracji funkcji. Prawda czy fałsz.

Ok, spójrzmy na deklarację funkcji:

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

Całość jest deklaracją . Deklaracja nie jest int func(), a następnie następuje przez a ;. Deklaracja to int func();, po której następuje spacja.

Więc pytanie brzmi: czy średnik jest potrzebny po deklaracji? Oczywiście, że nie. deklaracja ma już średnik, który ją zakończył. średnik po deklaracji byłby bezcelowy. Dla kontrastu, int func(); ; będzie średnikiem po deklaracji funkcji .

Pytanie było prawie na pewno przeznaczone aby zadać pytanie " prawdziwe lub false: ostatni znak w deklaracji funkcji jest zawsze średnikiem", ale to nie jest pytanie, które napisali, ponieważ autor quizu nie myślał jasno o problemie.

Moja rada to unikanie quizów w języku programowania. Są okropne.


Ciekawostka, skoro już o tym mowa. W C# wszystkie są legalne:
class C {}
class D {};
struct E {}
struct F {};

W C#, deklaracja klasy lub struktury może zakończyć się średnikiem, lub nie, według własnego uznania. Ten dziwny mały funkcja została dodana z korzyścią dla programistów C / C++ przybywających do C# , którzy mają to w zasięgu ręki, że deklaracje typu kończą się bezsensownym średnikiem; zespół projektantów nie chciał ich karać za posiadanie tego nawyku. :-)

 83
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-21 02:10:55

Możesz też zadeklarować taką funkcję:

int func(){
    return 1;
}

Stwierdzenie jest bardzo niejednoznaczne. Prawidłowa odpowiedź powinna brzmieć: to zależy od tego, jak zadeklarujesz funkcję.

W każdym razie, ja też wybrałbym false, i może mógłbyś komuś zgłosić pytanie.

 25
Author: Luca Corsini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-18 19:29:43

Średnik ( ' ;') nie jest potrzebny po deklaracji funkcji.

Prawda czy fałsz.

True . Średnik nie jest potrzebny po żadnej deklaracji. Ani po żadnej definicji. Ani po żadnym oświadczeniu.

Wiele rodzajów deklaracji musi kończyć się średnikiem, tak jak składnia w sekcji 7 [dcl.dcl] określa. Ale nigdy nie ma potrzeby pisania drugiego po tym.

 20
Author: Marc van Leeuwen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-22 14:35:28

To zależy od tego, czy deklarujemy czy definiujemy funkcję. Jeśli deklarujemy funkcję, musimy dołączyć średnik (;), a jeśli definiujemy funkcję, średnik nie jest potrzebny.

Deklaracja jest taka:

int add(int, int);

A definicja jest taka:

int add(int a, int b)
{
    // ...
}
 6
Author: Rocx En Ruff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-21 13:37:44

Mimo, że Zgadzam się z prawie wszystkimi innymi odpowiedziami, stwierdzając, że pytanie jest sformułowane bardzo niejednoznacznie, a Twoja odpowiedź jest poprawna technicznie, pozwól mi dać inną perspektywę: {]}

Tak je zawsze nazywałem:

void func();  // The function prototype

...

void func()
{
    // The function definition
}
Zakładam, że pytanie zostało sformułowane z myślą o tej terminologii.

Definicja i deklaracja są w moich oczach tym samym pojęciem. "I define x = y" = = "I declare x = y".

Ale oczywiście, jest duża różnica między prototypem funkcji (na górze) a rzeczywistą definicją funkcji.

 6
Author: Opifex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-18 19:32:43

Szkoda, że twoje pytanie nie mówi "bezpośrednio po". Możemy na przykład napisać:

int func()  /* My function */ ;

Albo mógłbym napisać:

int func()
int a = 42;

W pierwszym przypadku średnik nie jest bezpośrednio po deklaracji, ale byłoby to OK.

W drugim przypadku jest średnik " po " deklaracji, ale nie bezpośrednio po.

Myślę, że Eric Lippert ma właściwy pomysł w swojej odpowiedzi. To jak powiedzenie " Czy powinien być okres po zakończeniu zdania po angielsku?". Prawdopodobnie zdanie ma już kropkę na końcu (w przeciwnym razie nie byłoby zdania) i dlatego nie powinno być kropki po zdania..
 6
Author: Nick Gammon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-25 09:28:09

Możesz używać ; tylko dla prototypów.

 4
Author: M7off,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-18 19:33:20

To trochę podchwytliwe pytanie, ale użyli słowa declaration co oznacza coś takiego:

int example();
Więc to prawda w tym przypadku.

Gdyby użyli słowa implementacja to byłoby to fałszywe.

 4
Author: dark_3nergy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-18 19:36:04

Semicolon (;) jest używany do poinformowania kompilatora, że po tym średniku (;) rozpoczyna się nowa Instrukcja.

Więc myślę, że średnik (;) jest wymagany tylko podczas deklaracji funkcji. Więc według mnie odpowiedź będzie prawdziwa.

 2
Author: Jatinder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-19 11:20:45

Gdy funkcje są zdefiniowane przed main():

  • nie trzeba średnika ponieważ funkcja jest już zdefiniowana

Gdy funkcje są zdefiniowane po main():

  • Potrzebujesz średnika , ponieważ prototypujesz tę funkcję i mówisz kompilatorowi, że funkcja kończy działanie.
 2
Author: shiv shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-24 16:02:27