Welche dieser Antworten in Bezug auf Funktionen ist falsch?

17

Während ich einige lange Kompilierungen durchgeführt habe, habe ich mich für den allgemeinen C ++ - Test auf ODesk entschieden und bin auf diese Frage gestoßen.

Diese Frage

Wenn ich mich nicht irre, könnte angesichts des Wortlauts (oder des Fehlens davon) alles wahr sein.

ein.

int Foo() { }
int Foo(int bar) { }

b. Nun, return void;wäre semantisch falsch, aber Funktionen können offensichtlich voidRückgabetypen haben .

void Foo() { }

c. Dies ist die Definition von Inline-Funktionen, ja.

d. Ohne näher auf die Platzierung der folgenden Elemente einzugehen,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

Außerdem können Sie dies immer mit Lambdas und Funktoren tun .

e.

void Foo(int& bar)
{
    ++bar;
}

int foobar = 5;
Foo(foobar);

f.

int bar = 5;

int& GetBar()
{
    return bar;
}

GetBar() = 6;

G.

int bar = 5;

int* GetBar()
{
    return &bar;
}

(*GetBar()) = 5;

Ich verstehe nicht, wo diese Frage wirklich falsche Antworten hat. Vermisse ich etwas?

Unnötig zu erwähnen, dass mir die Zeit ausgegangen ist und das Ganze gescheitert ist. Ich denke, ich bin ein schlechter C ++ - Programmierer. :(

Qix
quelle
18
Kam hierher, um ein Kind anzuschreien, das Hausaufgaben machte, war angenehm überrascht.
SomeKittens
Tatsächlich erfordern nicht alle Sprachen, dass Inline-Funktionen erweitert werden. "inline" ist in Delphi eher ein Compiler-Hinweis als ein Befehl, und C, C ++ haben Ausnahmen . "C" kann also auch falsch sein. Es könnte unterhaltsamer sein, eine Antwort zu schreiben, die zeigt, wie falsch jede Aussage sein kann.
Móż
1
@ Ӎσᶎ Wenn es nur ein Textfeld gäbe. Ich möchte zurückgehen und auf "Ein Problem mit dieser Frage melden" klicken.
Qix
5
Das ist kein Array von Funktionen. Das ist ein Array von Funktionszeigern.
user253751
@immibis Stimmt, aber die Frage klärt nicht wirklich (zumindest für mich hat es nicht geklärt).
Qix

Antworten:

21

Diese ganze Frage ist zweifelhaft. Die Frage beinhaltet die Möglichkeit der Mehrfachauswahl, während die Optionsfelder eine einzige Auswahl angeben.

Außerdem ist b ziemlich verdächtig, da leere Funktionen nichts zurückgeben.

D ist auch fraglich, denn meines Wissens kann man keine Reihe von Funktionen haben. Sicher, Sie können eine Reihe von Funktionszeigern haben, aber das ist nicht genau dasselbe.

Whatsisname
quelle
Richtig; D ist wie zu fragen, ob Sie anrufen können int. Sicher, wenn Sie es auf einen Zeiger umwandeln und dieser Zeiger auf eine Funktion verweist ...
Qix
1
Ich bin bereit zu wetten, dass D die Antwort ist, nach der sie suchen, aber ja, die Frage ist schlecht.
Gort the Robot
Während voidFunktionen keinen Wert zurückgeben , geben sie dennoch den Typ zurück void . Also sage ich, B ist wahr.
Thomas Eding
@ThomasEding Das ist immer noch eine wirklich schlechte Formulierung von ihrer Seite. Sie nicht return void;, aber stattdessen return;.
Qix
10

Antwort c) ist wohl auch falsch.

Msgstr "Inline - Funktionen werden während der Kompilierung erweitert, um den Aufwand für den Aufruf zu vermeiden."

Erstens darf der C ++ - Compiler den inlineHinweis ignorieren, indem er die Funktionen überhaupt nicht erweitert.

Zweitens ist der genannte "Grund" für eine Erweiterung eine zu starke Vereinfachung. Tatsächlich liegt der eigentliche Grund für die Erweiterung (oder auch nicht) ganz in den Händen des Compiler-Autors.

Stephen C
quelle
Sie haben Recht, aber ich habe darüber nachgedacht im Sinne von "Okay, der Compiler hat festgestellt, dass er eine Funktion einbinden möchte" anstatt des inlineHinweises.
Qix
Nun, der Compiler kann den Hinweis nicht vollständig ignorieren. Zumindest ist es ein vorgeschriebener Effekt, eine Ausnahme von ODR.
Deduplicator
@ Deduplicator - Ja, das kann es. "Unabhängig davon, wie Sie eine Funktion als Inline kennzeichnen, ist es eine Anforderung, die der Compiler ignorieren darf: Der Compiler kann einige, alle oder keine Stellen, an denen Sie eine als Inline bezeichnete Funktion aufrufen, inline erweitern." - Quelle isocpp.org/wiki/faq/Inline-Functions
Stephen C
@StephenC: Die Anforderung, es inline zu erweitern, kann ignoriert werden, ja. Ich habe nur gesagt, dass die explizite Ausnahme von der ODR nicht möglich ist.
Deduplicator
Aha. Ich habe den Wortlaut meiner Antwort aktualisiert
Stephen C
7

c. Dies ist die Definition von Inline-Funktionen, ja.

Das ist nicht ganz richtig.
Trotz seines Namens inlinegarantiert das Schlüsselwort nicht, dass eine Funktion eingebettet wird. Sie können sich nur sicher sein, dass sich der Compiler nicht beschwert, wenn er die Definition einer Inline-Funktion mehrmals sieht.

Streng genommen ist Option C also falsch, aber ich glaube nicht, dass die Autoren des Quiz diese Antwort erwarten, da es eine noch falschere Antwort gibt.

d. Ohne näher auf die Platzierung der folgenden Elemente einzugehen,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

Außerdem können Sie dies immer mit Lambdas und Funktoren tun.

In Ihrem Beispiel functionshandelt es sich um ein Array von Zeigern auf Funktionen und nicht um ein Array von Funktionen. Ebenso funktionieren Lambdas und Funktoren auch nicht wirklich. Dies sind Klassen, die auf den Funktionsaufrufoperator reagieren, die jedoch in den Augen der C ++ - Sprachdefinition nicht funktionieren.

Funktionen in C ++ sind ein bisschen wie Bürger zweiter Klasse. Sie können sie definieren und aufrufen, aber sobald Sie versuchen, mit einem Funktionstyp etwas anderes zu tun (z. B. ein Array von ihnen zu erstellen), wird entweder ein Fehler angezeigt, oder sie konvertieren sich stillschweigend in einen Zeiger.

Bart van Ingen Schenau
quelle
Ich stimme dem D-Bit zu, aber ich habe cals Funktionen gelesen , die bereits positiv für das Inlining markiert wurden, im Vergleich zum eigentlichen inlineSchlüsselwort. Ich verstehe, inlineist ein Hinweis.
Qix
4

Wenn überhaupt, müsste es sein, b . Sie können nicht returna void, aber Sie können a zurückgebennull . Die Funktionsdeklaration sollte ungültig sein, um den Compiler über das Fehlen eines zurückgegebenen Werts zu informieren.

Leerart

In C und C ++

Eine Funktion mit dem Ergebnistyp void wird entweder durch Erreichen des Funktionsendes oder durch Ausführen einer return-Anweisung ohne zurückgegebenen Wert beendet. Der Void-Typ kann auch als einziges Argument eines Funktionsprototyps erscheinen, um anzuzeigen, dass die Funktion keine Argumente akzeptiert. Beachten Sie, dass trotz des Namens in all diesen Situationen der Leertyp als Einheitentyp und nicht als Null- oder Bodentyp dient, obwohl der Leertyp im Gegensatz zu einem reellen Einheitentyp, der ein Singleton ist, ein Leerzeichen sein soll Wertesatz, und die Sprache bietet keine Möglichkeit, ein Objekt zu deklarieren oder einen Wert mit dem Typ void darzustellen.

Adam Zuckerman
quelle
2
-1: Während voidFunktionen keinen Wert zurückgeben , geben sie dennoch den Typ zurück void . Also sage ich, B ist wahr.
Thomas Eding
Die Rückgabe des Widerrufs ist unter bestimmten Umständen zulässig. Sehen Sie hier .
Josh Kelley