variable - std::function c++




Non è necessario un punto e virgola(';') dopo una dichiarazione di funzione in C++? (8)

Di recente ho svolto un test di programmazione intermedio e una delle domande che ho sbagliato era la seguente:

Un punto e virgola (';') non è necessario dopo una dichiarazione di funzione.

Vero o falso.

Ho scelto "false" (e, per favore, correggimi se sbaglio perché sento che sto impazzendo), una dichiarazione di funzione è ciò che scrivi prima della definizione (nella parte superiore del codice) in modo che il compilatore conosca la funzione chiama prima ancora di chiamarla, e una definizione di funzione è ciò che costituisce la funzione nel suo insieme.

Vale a dire,

Dichiarazione:

int func();

Definizione:

int func() {
  return 1;
}

La risposta a questo non dovrebbe essere falsa?


Un punto e virgola (';') non è necessario dopo una dichiarazione di funzione.

Vero o falso.

Vero Un punto e virgola non è necessario dopo alcuna dichiarazione. Né dopo alcuna definizione. Né dopo alcuna affermazione.

Molti tipi di dichiarazione devono terminare con un punto e virgola, come specifica la sintassi nella sezione 7 [dcl.dcl]. Ma non c'è mai bisogno di scriverne una dopo.


È un peccato che la domanda che hai fatto non dica "subito dopo". Potremmo ad esempio scrivere questo:

int func()  /* My function */ ;

Oppure potrei scrivere:

int func()
int a = 42;

Nel primo caso il punto e virgola non è direttamente dopo la dichiarazione, ma sarebbe OK.

Nel secondo caso c'è un punto e virgola "dopo" la dichiarazione, ma non direttamente dopo.

Penso che Eric Lippert abbia la giusta idea nella sua risposta .

È come dire "dovrebbe esserci un periodo dopo la fine di una frase in inglese?". Probabilmente, una frase ha già un punto alla fine (altrimenti non sarebbe una frase) e quindi non dovrebbe esserci un periodo dopo la frase.


Anche se sono d'accordo con quasi tutte le altre risposte, affermando che la domanda è formulata in modo molto ambiguo e che la tua risposta è tecnicamente corretta, permettimi di dare una prospettiva diversa:

Ecco come li ho sempre chiamati:

void func();  // The function prototype

...

void func()
{
    // The function definition
}

Suppongo che la domanda sia stata inventata tenendo presente questa terminologia.

Definizione e dichiarazione sono entrambe lo stesso concetto ai miei occhi. "Definisco x = y" == "Dichiaro x = y".

Ma ovviamente c'è una grande differenza tra il prototipo di funzione (in alto) e la definizione effettiva della funzione.


Il punto e virgola (;) viene utilizzato per indicare al compilatore che dopo questo punto e virgola (;) inizia una nuova istruzione.

Quindi penso che il punto e virgola (;) sia richiesto solo durante una dichiarazione di funzione. Quindi, secondo me, la risposta sarà vera.


Oltre a "una definizione è anche una dichiarazione", il C ++ legale è il seguente:

int f(), g();

Questo dichiara due funzioni, f , entrambe senza argomenti e con un tipo restituito di int , ma la definizione di f non è seguita (immediatamente) da un punto e virgola. Allo stesso modo, questo è legale:

int f(), i = 42;

Ma in questi casi non è consentito omettere del tutto il punto e virgola, quindi sarebbe piuttosto sorprendente se uno dei due fosse preso come esempio di una dichiarazione senza un punto e virgola successivo. In effetti, quanto segue è illegale:

void *p, f() {}

A parte una (semplice) dichiarazione di funzione, una definizione di funzione non può essere combinata con qualsiasi altra dichiarazione o definizione allo stesso identificatore di tipo . (Se questo fosse legale, definirebbe sia un void *p che un void f() {} .)

In ogni caso, questo sembra essere un tipo di domanda "gotcha" che non dovrebbe essere in un test di programmazione intermedio.

(Oh, a proposito, per favore non scrivere codice come int f(), i = 42; )


Puoi avere una situazione in cui dichiari e definisci la funzione in un solo passaggio, cioè se includi la definizione della funzione nel punto in cui la stai dichiarando. Quindi tecnicamente suppongo che il vero sia corretto. Ma la domanda è formulata in modo tale che avrei risposto come hai fatto tu.


Puoi usare ; solo per prototipi.


Quando le funzioni sono definite prima di main () :

  • Non è necessario il punto e virgola perché la funzione è già definita

Quando le funzioni sono definite dopo main () :

  • Hai bisogno del punto e virgola perché perché stai prototipando quella funzione e stai dicendo al compilatore che la funzione esce.




declaration