Sehr oft sehe ich im ANSI C-Code Klammern, die einen einzelnen Rückgabewert umgeben.
So was:-
int foo(int x) {
if (x)
return (-1);
else
return (0);
}
Warum in diesen Fällen () um den Rückgabewert verwenden? Irgendwelche Ideen? Ich kann keinen Grund dafür sehen.
c
syntax
coding-style
Tooony
quelle
quelle
Antworten:
Es gibt wirklich keinen Grund ... es ist nur eine alte Konvention.
Um Platz zu sparen, führen Programmierer häufig die endgültige Berechnung in der Rückgabezeile statt in der eigenen Zeile durch, und die Parens stellen sicher, dass diese meistens vorhanden sind, um leichter zu erkennen, dass es sich um eine einzelne Anweisung handelt, die wie folgt zurückgegeben wird:
return (x+i*2);
anstatt
int y = x+i*2; return y;
Die Klammer wurde zur Gewohnheit und blieb hängen.
quelle
return x+i*2;
doch kürzer?if
et al. Loswerden, wenn ich König wäre). Wasmake it easier to see that it is a single statement that is returned
erstens das ist ein Ausdruck , keine „Anweisung“ - und was - denken Menschenreturn
ein gieriger Operator ist und dassreturn x+i*2
könnte zurückkehrenx
und den Rest verwerfen? Wenn ja, wow. Oder dachte diese Antwort wirklich über lange Ausdrücke nach, die mehrere Zeilen umfassen könnten? In jedem Fall hat es seinen eigenen Punkt völlig verfehlt.Ein praktisches, aber unwahrscheinliches Motiv ist, dass Sie, wenn Sie den Wert in Klammern setzen, die Rückgabe als Makro definieren und dann einen Protokollcode einfügen können, um alle Ihre Rückgaben zu überwachen.
quelle
Mein persönlicher Stil ist es, Klammern zu verwenden, wenn es einen komplexen Ausdruck gibt; z.B,
return (a + b);
aber sie nicht zu verwenden, wenn der Ausdruck ein einfacher Begriff ist
return a;
Ich kann nicht sagen, warum ich das so mache. Nur etwas, das ich vor langer Zeit aufgegriffen habe.
Übrigens denke ich, dass es wie ein Funktionsaufruf aussieht, wie folgt:
return(a); // ugh
ist unglaublich hässlich und einfach falsch.
quelle
return (a);
undreturn a ;
In der ursprünglichen C-Spezifikation waren Klammern um den Rückgabewert erforderlich. Während moderne C-Compiler und der ANSI C-Standard sie nicht erfordern, wirkt sich das Vorhandensein von Klammern nicht auf den Rückgabewert aus, und Programmierer schließen sie manchmal immer noch aus Gewohnheit ein, ohne mit den Standards vertraut zu sein, um die Übereinstimmung mit einer Stilkonvention zu gewährleisten, die sie erfordert. oder möglicherweise aus Gründen der Abwärtskompatibilität.
Ich sollte hinzufügen, für Leute, die über C ++ nachdenken: Diese Frage bezieht sich auf C und C ist nicht C ++; Dies sind zwei verschiedene Sprachen mit unterschiedlichen Standards, Fähigkeiten, Schwierigkeitsgraden und unterschiedlichen Verwendungsstilen - was auch immer sie gemeinsam haben, es ist ratsam, sie als zwei völlig getrennte Dinge zu behandeln. Eine ähnliche Frage zu C ++ finden Sie unter Sind Klammern um das Ergebnis in einer return-Anweisung von Bedeutung? .
quelle
Es gibt einige Gründe:
if / while / for / etc. sind alle Steuerschlüsselwörter, die Parens haben müssen. Daher erscheint es oft selbstverständlich, sie auch immer wieder zurückzugeben.
sizeof ist das einzige andere Schlüsselwort , das sie entweder hat oder nicht, mit der Ausnahme , dass in einigen Fällen Sie müssen Pars verwenden. So ist es einfacher, sich daran zu gewöhnen, immer Parens zu verwenden. für sizeof, was eine Logik impliziert: Wenn du kannst, immer tun.
case / goto sind die einzigen Schlüsselwörter, bei denen Sie niemals Parens verwenden. ... und die Leute neigen dazu, diese als Sonderfälle zu betrachten (und möchten, dass sie sich beide von anderen Kontrollschlüsselwörtern abheben, insbesondere von goto).
quelle
Wenn Sie wie in Ihrem Beispiel -1 zurückgeben, ist dies in Klammern besser lesbar, da das Minus besser sichtbar ist:
return 1
oder
return -1
oder
return (-1)
quelle
Vielleicht ist es Brauch - schließlich kamen die Leute, die uns Unix und C gebracht haben, aus dem Multics-Projekt. Multics wurde in PL / I geschrieben, und in PL / I sind die Klammern obligatorisch.
quelle
Ich habe mit mindestens einem Programmierer zusammengearbeitet, der dachte, Return sei eine spezielle Art von Funktionsaufruf, und war überrascht, als er sah, dass mein Code ohne die Parens übereinstimmte.
quelle
Wie so oft bei der Verwendung von Klammern, denke ich, dient dies nur der Lesbarkeit (z. B. unterstützt Ruby Methodenaufrufe ohne Klammern, die die Argumente enthalten, aber neuere Bücher und Artikel raten zu etwas anderem).
quelle
Die Klammern in einer return-Anweisung geben dem Compiler an, dass dieser Wert auf dem Stapel anstatt im Speicher zurückgegeben werden soll.
Früher wurde dies (normalerweise) rigoros durchgesetzt, aber heute nehmen die meisten Compiler dies nur als Hinweis.
Dies ist etwas, was ich häufig mache, da ein Fehler alles beschädigen kann, was über eine Speicherreferenz zurückgegeben wird, aber normalerweise keine Auswirkung auf eine Variable hat, die auf dem Stapel zurückgegeben wird.
Die Verwendung des Stapels für transiente Variablen reduziert auch die Speichernutzung und beschleunigt in der Regel den Funktionsaufruf / die Rückgabe, da der Stapel für transiente Daten / Variablen ausgelegt ist.
quelle
Die Verwendung von Klammern in einer return-Anweisung zeigt ein mangelhaftes Verständnis der
C/C++
Syntax. So einfach ist das. Aber es ist nicht so schlimm, als würde man alles in geschweifte Klammern setzen:int foo(int x) { if (x) { return (-1); } else { return (0); } }
So viele Programmierer machen das. Wenn einer von Ihnen dies liest, möchten Sie es vielleicht erklären.
quelle