Ich habe kürzlich einen Zwischenprogrammiertest gemacht und eine der Fragen, die ich falsch gestellt habe, war folgende:
Ein Semikolon (';') wird nach einer Funktionsdeklaration nicht benötigt.
Richtig oder falsch.
Ich entschied mich für „falsch“ (und bitte korrigieren Sie mich , wenn ich falsch bin , weil ich fühle , dass ich verrückt werde), eine Funktion Erklärung ist , was Sie vor der Definition schreiben (am Anfang des Codes) so dass der Compiler die Funktion kennt rufen , bevor sogar nennen es, und eine Funktion Definition ist es, was die Funktion als Ganzes bildet.
Dh
Erklärung:
int func();
Definition:
int func() {
return 1;
}
Sollte die Antwort darauf nicht falsch sein?
c++
function
syntax
declaration
Logan
quelle
quelle
Antworten:
Es kann vorkommen, dass Sie die Funktion in einem Schritt deklarieren und definieren, dh wenn Sie die Funktionsdefinition an der Stelle einfügen, an der Sie sie deklarieren. So technisch nehme ich wahr richtig ist. Aber die Frage ist so formuliert, dass ich sie so beantwortet hätte, wie Sie es getan haben.
quelle
Zusätzlich zu der Sache "Eine Definition ist auch eine Deklaration" ist Folgendes legal C ++:
Dies deklariert zwei Funktionen,
f
und zwarg
sowohl ohne Argumente als auch mit einem Rückgabetyp vonint
, aber der Definition vonf
folgt nicht (sofort) ein Semikolon. Ebenso ist dies legal:In diesen Fällen darf das Semikolon jedoch nicht vollständig weggelassen werden. Daher wäre es etwas überraschend, wenn eines der beiden Beispiele als Beispiel für eine Deklaration ohne nachfolgendes Semikolon herangezogen würde. In der Tat ist Folgendes illegal:
Anders als eine (nur) Funktionsdeklaration, eine Funktion Definition kann nicht mit anderen Erklärung oder Definition derselben kombiniert werden Typ-Spezifizierer . (Wenn dies legal wäre, würde es sowohl a
void *p
als auch a definierenvoid f() {}
.)In jedem Fall scheint dies eine Art "Gotcha" -Frage zu sein, die nicht in einem Zwischenprogrammiertest enthalten sein sollte.
(Oh, übrigens, bitte schreibe keinen Code wie
int f(), i = 42;
.)quelle
typedef int fooProc(int); fooProc a,b.c.d.e;
Ich bin mir beispielsweise nicht sicher, warum Standard-Header für Compiler auf Diskettenlaufwerk dies in der Vergangenheit nicht getan haben Tag, da ich denken würde, dass Header-Dateien viel kleiner und damit schneller zu verarbeiten gewesen wären.int f(int(&g)(),int(*h)()){return g()+h();}
dies drei Funktionsdeklarationen hat, von denen eine von einer offenen geschweiften Klammer, eine von einem Komma und eine dritte von einer engen Klammer gefolgt wird.int f(stuff)
. Auch im Funktionsumfangg
ist eine automatische Variable vom Typ auf Funktion verweisen undh
ein Zeiger auf Funktion .Die anderen Antworten und Kommentare zeigen einige der vielen Möglichkeiten auf, dass dies eine schreckliche, irreführende und schlecht geschriebene Frage ist. Aber es gibt noch ein anderes Problem, das noch niemand identifiziert hat. Die Frage ist:
OK, schauen wir uns eine Funktionsdeklaration an:
Das Ganze ist die Erklärung . Die Erklärung wird nicht
int func()
und dann gefolgt von ein;
. Auf die Deklarationint func();
folgt ein Leerzeichen.Die Frage ist also: Wird nach der Deklaration ein Semikolon benötigt ? Natürlich nicht. Die Deklaration enthält bereits ein Semikolon, das sie beendet hat. Ein Semikolon nach der Deklaration wäre sinnlos. Im Gegensatz,
int func(); ;
wäre ein Semikolon nach einer Funktionsdeklaration .Die Frage war mit ziemlicher Sicherheit bestimmt „: ist die letzte Token in einer Funktionsdeklaration immer ein Semikolon wahr oder falsch“ Aber das ist nicht die Frage , die sie geschrieben hat , weil der Autor des Quiz war nicht klar , über das Problem zu denken , die Frage zu stellen.
Mein Rat ist, Programmiersprachen-Quiz insgesamt zu vermeiden. Sie sind ziemlich schrecklich.
Lustige Tatsache, während wir auf dem Thema sind. In C # sind diese alle legal:
In C # kann eine Klassen- oder Strukturdeklaration nach Ihrem Ermessen mit einem Semikolon enden oder nicht. Diese seltsame kleine Funktion wurde für C / C ++ - Programmierer hinzugefügt, die zu C # kommen und wissen, dass Typdeklarationen mit einem sinnlosen Semikolon enden. Das Designteam wollte sie nicht dafür bestrafen, dass sie diese Angewohnheit hatten. :-)
quelle
Sie können eine Funktion auch wie folgt deklarieren:
Die Aussage ist sehr vieldeutig. Die richtige Antwort sollte lauten: Es hängt davon ab, wie Sie die Funktion deklarieren.
Wie auch immer, ich hätte auch falsch gewählt, und vielleicht können Sie die Frage jemandem melden.
quelle
Stimmt . Nach einer Deklaration wird kein Semikolon benötigt. Noch nach irgendeiner Definition. Noch nach irgendeiner Aussage.
Viele Arten von Deklarationen müssen mit einem Semikolon enden, wie in der Syntax in Abschnitt 7 [dcl.dcl] angegeben. Aber danach muss nie mehr ein zweiter geschrieben werden.
quelle
Dies hängt davon ab, ob wir die Funktion deklarieren oder definieren. Wenn wir die Funktion deklarieren, müssen wir das Semikolon (
;
) einfügen , und wenn wir die Funktion definieren, wird das Semikolon nicht benötigt.Eine Erklärung lautet wie folgt:
Und eine Definition ist wie folgt:
quelle
Auch wenn ich fast allen anderen Antworten zustimme und feststelle, dass die Frage sehr vieldeutig ist und Ihre Antwort technisch korrekt ist, kann ich eine andere Perspektive geben:
So habe ich sie immer genannt:
Ich gehe davon aus, dass die Frage unter Berücksichtigung dieser Terminologie gestellt wurde.
Definition und Erklärung sind in meinen Augen dasselbe Konzept. "Ich definiere x = y" == "Ich deklariere x = y".
Aber natürlich gibt es einen großen Unterschied zwischen dem Funktionsprototyp (oben) und der tatsächlichen Definition der Funktion.
quelle
void func();
genau diesenvoid func(void);
. Dies unterscheidet sich stark von C , wovoid func();
der Compiler nichts über die Argumente sagt und nicht dasselbe ist wievoid func(void);
. Ein späterer Prototyp oder eine spätere Definition sind eine gute Idee, andernfalls muss der Aufrufer die Standard-Arg-Promotions anwenden (z. B. float -> double und engen Integer-Typen aufint
. Gleiche Regeln wie für Args auf verschiedene Funktionen.)Schade, dass die Frage, die Sie gestellt haben, nicht "direkt danach" lautet. Wir könnten zum Beispiel folgendes schreiben:
Oder ich könnte schreiben:
Im ersten Fall steht das Semikolon nicht direkt danach der Deklaration, aber das wäre in Ordnung.
Im zweiten Fall steht ein Semikolon "nach" der Deklaration, jedoch nicht direkt danach.
Ich denke, Eric Lippert hat die richtige Idee in seiner Antwort .
Es ist wie zu sagen "sollte es einen Punkt nach dem Ende eines Satzes auf Englisch geben?". Wahrscheinlich hat ein Satz bereits einen Punkt am Ende (sonst wäre es kein Satz) und daher sollte es keinen Punkt nach dem Satz geben.
quelle
int func() int a=42;
kompiliert nicht. Du brauchst ein Komma, kein anderesint
. Siehe die Antwort von @ Arne, die über einen Tag zuvor veröffentlicht wurde. Das einzig Neue an dieser Antwort ist der letzte Absatz mit der Analogie zu englischen Sätzen.Sie können
;
nur für Prototypen verwenden.quelle
Es ist eine knifflige Frage, aber sie haben das Wort Deklaration verwendet, was ungefähr so viel bedeutet:
In diesem Fall ist es also wahr.
Wenn sie das Wort Implementierung verwendet hätten , wäre es falsch gewesen.
quelle
Semikolon (;) wird verwendet, um dem Compiler mitzuteilen, dass nach diesem Semikolon (;) eine neue Anweisung beginnt.
Ich denke also, dass das Semikolon (;) nur während einer Funktionsdeklaration benötigt wird. Meiner Meinung nach wird die Antwort wahr sein.
quelle
Wenn Funktionen vor main () definiert sind :
Wenn Funktionen nach main () definiert sind :
quelle