Je viens de passer un test de programmation intermédiaire, et l'une des questions que je me suis trompé était la suivante:
Un point-virgule (';') n'est pas nécessaire après une déclaration de fonction.
Vrai ou faux.
J'ai choisi "faux" (et corrigez-moi si je me trompe car j'ai l'impression de devenir fou), une déclaration de fonction est ce que vous écrivez avant la définition (en haut du code) pour que le compilateur connaisse la fonction appelez avant même de l'appeler, et une définition de fonction est ce qui constitue la fonction dans son ensemble.
C'est à dire,
Déclaration:
int func();
Définition:
int func() {
return 1;
}
La réponse à cela ne devrait-elle pas être fausse?
c++
function
syntax
declaration
Logan
la source
la source
Réponses:
Vous pouvez avoir une situation où vous déclarez et définissez la fonction en une seule étape, c'est-à-dire si vous incluez la définition de fonction au point où vous la déclarez. Donc, techniquement, je suppose que la vérité est correcte. Mais la question est formulée de telle manière que j'y aurais répondu comme vous l'avez fait.
la source
En plus de la chose "une définition est aussi une déclaration", ce qui suit est un C ++ légal:
Cela déclare deux fonctions,
f
etg
, toutes deux sans arguments et avec un type de retour deint
, mais la définition def
n'est pas suivie (immédiatement) d'un point-virgule. De même, c'est légal:Mais il n'est en effet pas permis d'omettre complètement le point-virgule dans ces cas, il serait donc quelque peu surprenant que l'un ou l'autre soit pris comme exemple de déclaration sans point-virgule suivant. En fait, ce qui suit est illégal:
Hormis une (simple) déclaration de fonction, une définition de fonction ne peut être combinée avec aucune autre déclaration ou définition pour le même spécificateur de type . (Si cela était légal, cela définirait à la fois a
void *p
et avoid f() {}
.)Dans tous les cas, cela semble être une question de type "gotcha" qui ne devrait pas être dans un test de programmation intermédiaire.
(Oh, au fait, n'écrivez pas de code comme ça
int f(), i = 42;
.)la source
typedef int fooProc(int); fooProc a,b.c.d.e;
je ne sais pas pourquoi les en-têtes standard des compilateurs basés sur un lecteur de disquette ne l'ont pas fait dans le jour, car je pense que cela aurait permis aux fichiers d'en-tête d'être beaucoup plus petits et donc plus rapides à traiter.int f(int(&g)(),int(*h)()){return g()+h();}
ceci a trois déclarations de fonction, dont l'une est suivie d'une accolade ouverte, une autre par une virgule et une troisième par une parenthèse fermée.int f(stuff)
. Même dans la portée de la fonction,g
est une variable automatique de type référence à la fonction eth
est un pointeur vers la fonction .Les autres réponses et commentaires évoquent plusieurs des nombreuses façons dont il s'agit d'une question horrible, trompeuse et mal écrite. Mais il y a un autre problème que personne d'autre n'a encore identifié. La question est:
OK, regardons une déclaration de fonction:
Tout cela est la déclaration . La déclaration ne
int func()
puis suivie d' un;
. La déclaration estint func();
suivie d'un espace blanc.Donc, la question est: un point-virgule est-il nécessaire après la déclaration ? Bien sûr que non. La déclaration contient déjà un point-virgule qui l'a terminée. Un point-virgule après la déclaration serait inutile. En revanche,
int func(); ;
serait un point-virgule après une déclaration de fonction .La question visait presque certainement à poser la question "vrai ou faux: le dernier jeton dans une déclaration de fonction est toujours un point-virgule" Mais ce n'est pas la question qu'ils ont écrite, car l'auteur du quiz ne pensait pas clairement au problème.
Mon conseil est d'éviter complètement les quiz de langage de programmation. Ils sont assez horribles.
Fait amusant, pendant que nous sommes sur le sujet. En C #, tout cela est légal:
En C #, une déclaration de classe ou de structure peut se terminer par un point-virgule, ou non, à votre discrétion. Cette petite fonctionnalité étrange a été ajoutée au profit des programmeurs C / C ++ venant en C # qui ont entre les doigts que les déclarations de type se terminent par un point-virgule inutile; l'équipe de conception ne voulait pas les punir d'avoir cette habitude. :-)
la source
Vous pouvez également déclarer une fonction comme celle-ci:
La déclaration est très ambiguë. La bonne réponse devrait être: cela dépend de la façon dont vous déclarez la fonction.
Quoi qu'il en soit, j'aurais choisi faux aussi, et peut-être pourriez-vous signaler la question à quelqu'un.
la source
Vrai . Un point-virgule n'est pas nécessaire après une déclaration. Ni après aucune définition. Ni après aucune déclaration.
De nombreux types de déclaration doivent se terminer par un point-virgule, comme le spécifie la syntaxe de la section 7 [dcl.dcl]. Mais il n'est jamais nécessaire d'en écrire un second après cela.
la source
Cela dépend si nous déclarons ou définissons la fonction. Si nous déclarons la fonction, nous devons inclure le point-virgule (
;
), et si nous définissons la fonction, le point-virgule n'est pas nécessaire.Une déclaration est comme ceci:
Et une définition est comme ceci:
la source
Même si je suis d'accord avec presque toutes les autres réponses, en déclarant que la question est formulée de manière très ambiguë et que votre réponse est techniquement correcte, permettez-moi de donner une perspective différente:
C'est ainsi que je les ai toujours appelés:
Je suppose que la question a été posée avec cette terminologie à l'esprit.
La définition et la déclaration sont toutes deux le même concept à mes yeux. "Je définis x = y" == "Je déclare x = y".
Mais bien sûr, il y a une grande différence entre le prototype de fonction (en haut) et la définition réelle de la fonction.
la source
void func();
sont exactement équivalentes àvoid func(void);
. C'est très différent de C , oùvoid func();
ne dit rien au compilateur sur les arguments, et ce n'est pas la même chose quevoid func(void);
. Un prototype ou une définition plus tardive est une bonne idée, sinon l'appelant doit appliquer les promotions arg par défaut (par exemple, float -> double, et les types entiers étroits àint
. Mêmes règles que pour args aux fonctions variadiques.)C'est dommage que la question que vous avez posée ne dise pas «directement après». On pourrait par exemple écrire ceci:
Ou je pourrais écrire:
Dans le premier cas, le point-virgule n'est pas directement après la déclaration, mais ce serait OK.
Dans le second cas, il y a un point-virgule "après" la déclaration, mais pas directement après.
Je pense qu'Eric Lippert a la bonne idée dans sa réponse .
C'est comme dire "devrait-il y avoir un point après la fin d'une phrase en anglais?". On peut soutenir qu'une phrase a déjà un point à la fin (sinon ce ne serait pas une phrase) et qu'il ne devrait donc pas y avoir de point après la phrase.
la source
int func() int a=42;
ne compile pas. Vous avez besoin d'une virgule, pas d'une autreint
. Voir la réponse de @ Arne publiée plus d'un jour avant cela. La seule nouveauté dans cette réponse est le dernier paragraphe, avec l'analogie avec les phrases anglaises.Vous ne pouvez utiliser que
;
pour les prototypes.la source
C'est un peu une question délicate, mais ils ont utilisé le mot déclaration qui signifie quelque chose comme ceci:
C'est donc vrai dans ce cas.
S'ils avaient utilisé le mot implémentation, c'était faux.
la source
Le point-virgule (;) est utilisé pour indiquer au compilateur qu'après ce point-virgule (;) une nouvelle instruction démarre.
Je pense donc que le point-virgule (;) n'est requis que lors d'une déclaration de fonction. Donc, selon moi, la réponse sera vraie.
la source
Lorsque les fonctions sont définies avant main () :
Lorsque les fonctions sont définies après main () :
la source