Wenn Ihr Code kompiliert, wäre es wahrscheinlich (dh auf den meisten anständigen Compiler) ähnlich den folgenden Pseudo-Code, um etwas zu übersetzen:
if (a != true)
jump else
foo() * will not execute if a is false
* because of the `jump else`
jump end
else:
bar() * will not execute if a is true
* because of the `jump end`
end:
wo else
und end
sind Etiketten (versuchen sie es mit echten und falschen a
auf Papier zu laufen).
Grundsätzlich werden beide Schnipsel auf die gleiche kompilierte Version übersetzen, und Ihre goto
wird keine Wirkung auf das Ergebnis haben, weil es in der Verzweigung enthalten ist. In den meisten Fällen wird Ihr Compiler für weitere 2 Millisekunden zum Schwitzen gebracht, um ihn zu erkennen und zu ignorieren.
Wenn man die Leistung betrachtet, hat ein manueller Sprung, der halb impliziert ist, nicht viel Bedeutung. Breaking-Loops, Nicht-Re-Deklaration und andere Programmierer-Ende-Optimierungsaktivitäten tragen viel mehr dazu bei.
Als Anmerkung, ist diese Verzweigung wie Montagebedingungen gebaut werden, wie man speichert die logische Operation in einem Register und vergleichen Sie es zu prüfen, ob springen oder nicht. Ein genauerer Pseudo-Code würde
cmp a, true /or/ xor a, a ; 0 if true, 1 if false
jne else /or/ jnz else ; jump if not equal/zero
foo()
jmp end ; jump to
else:
bar()
end:
nein, tun das nicht – yano
überhaupt keinen Sinn macht. – AnT
der Compiler würde automatisch Code generieren, um nach dem else Teil zu verzweigen. Außerdem sollten Sie sagen: if (a) ' – bruceg