Angenommen, ich habe eine if
-Anweisung mit einer return
. Aus Effizienzsicht sollte ich verwenden
if(A > B):
return A+1
return A-1
oder
if(A > B):
return A+1
else:
return A-1
Soll ich die eine oder andere bevorzugen, wenn Sie eine kompilierte Sprache (C) oder eine Skriptsprache (Python) verwenden?
Da die Anweisung return
die Ausführung der aktuellen Funktion abbricht, sind die beiden Formen gleichwertig (obwohl die zweite möglicherweise lesbarer ist als die erste).
Die Effizienz beider Formen ist vergleichbar, der zugrunde liegende Maschinencode muss einen Sprung ausführen, wenn die if
-Bedingung ohnehin falsch ist.
Beachten Sie, dass Python eine Syntax unterstützt, mit der Sie in Ihrem Fall nur eine return
-Anweisung verwenden können:
return A+1 if A > B else A-1
Vom Chromium Style Guide:
Verwenden Sie nach der Rückkehr keine anderen Anwendungen:
# Bad
if (foo)
return 1
else
return 2
# Good
if (foo)
return 1
return 2
return 1 if foo else 2
Bezüglich des Codierungsstils:
Die meisten Codierungsstandards, egal in welcher Sprache, verbieten mehrere Rückgabeanweisungen aus einer einzigen Funktion als schlechte Praxis.
(Obwohl ich persönlich sagen würde, gibt es mehrere Fälle, in denen mehrere return-Anweisungen sinnvoll sind: Text-/Datenprotokoll-Parser, Funktionen mit umfangreicher Fehlerbehandlung usw.)
Der Konsens aller Industriestandards ist, dass der Ausdruck wie folgt geschrieben werden sollte:
int result;
if(A > B)
{
result = A+1;
}
else
{
result = A-1;
}
return result;
In Bezug auf Effizienz:
Das obige Beispiel und die beiden Beispiele in der Frage sind alle in Bezug auf die Effizienz vollständig äquivalent. Der Maschinencode muss in allen diesen Fällen A> B vergleichen, dann zu der A + 1- oder A-1-Berechnung verzweigen und das Ergebnis in einem CPU-Register oder im Stack speichern.
BEARBEITEN:
Quellen:
Bei jedem vernünftigen Compiler sollten Sie keinen Unterschied feststellen; Sie sollten zu identischem Maschinencode kompiliert werden, da sie gleichwertig sind.
Version A ist einfacher und deshalb würde ich es verwenden.
Wenn Sie alle Compiler-Warnungen in Java aktivieren, erhalten Sie in der zweiten Version eine Warnung, da diese unnötig ist und die Komplexität des Codes erhöht.
Ich persönlich vermeide wenn möglich else
-Blöcke. Siehe die Anti-if-Kampagne
Sie berechnen auch nicht "extra" für die Leitung, wissen Sie: p
"Einfach ist besser als komplex" & "Lesbarkeit ist König"
delta = 1 if (A > B) else -1
return A + delta
Ich weiß, dass die Frage mit Python markiert ist, aber es erwähnt dynamische Sprachen. Ich dachte, ich sollte erwähnen, dass die if -Anweisung in Ruby tatsächlich einen Rückgabetyp hat, damit Sie so etwas tun können
def foo
rv = if (A > B)
A+1
else
A-1
end
return rv
end
Oder weil es auch implizite Renditen hat
def foo
if (A>B)
A+1
else
A-1
end
end
was um die Stilfrage herumgeht, dass nicht mehrere Renditen ganz nett sind.
Stellen Sie es sich so vor:
if (a > b):
output = a + 1
output = a - 1
return output
Versus this:
if (a > b):
output = a + 1
else:
output = a - 1
return output
Das erste Beispiel ist nicht funktionsfähig, während das zweite gut funktioniert. Sie haben die gleiche Leistung, daher empfehle ich Ihnen, Beispiel 2 zu verwenden, da es meiner Meinung nach einfacher ist, es zu lesen.