2016-09-28 3 views
1

Ich habe eine ganze Reihe von Antworten zu SO gelesen, kann aber keine definitive Antwort finden, warum, wenn Pause in diesem Fall ausgelassen wird, der Fall "C" immer als wahr gewertet wird und nur das neue Array gefüllt wird "G" s. Ich verstehe klar, dass Break am besten hier verwendet werden würde, da ich nur eine bestimmte Übereinstimmung bewerten möchte, aber nicht so, warum der letzte Fall immer wahr ist, wenn Pause tatsächlich weggelassen wird.Warum wird Break benötigt, wenn Switch verwendet wird?

var dna = "ATTGC"; 
var outArr = []; 
dna.split("").forEach(function(e,i){ 
    switch(e) { 
     case "G": outArr[i] = "C"; break; 
     case "T": outArr[i] = "A"; break; 
     case "A": outArr[i] = "T"; break; 
     case "C": outArr[i] = "G"; break; 
    } 
    console.log(outArr); 
    }) 
+1

Die 'Schalter ... case' Aussage ist so ausgelegt, dass, wenn Sie die' break' Anweisung weglassen, die Auswertung der Bedingung „fällt durch“ nach unten den verschiedenen Fällen. Was Sie also sehen, wenn Sie "Pause" weglassen, ist die Bedingung, die bis zum letzten Fall passt. –

+0

Es ist nicht so, dass der letzte Fall wahr ist, sondern dass jeder Fall ein Eintrittspunkt ist, nach dem alle Anweisungen bis zum Ende des 'switch' Blocks ausgeführt werden. – shmosel

+0

Zusätzlich zu was jeyoung hat kommentiert. Die 'Pause;' ist aus einem guten Grund da, wenn du dasselbe für verschiedene Fälle machen willst, kannst du es tun und es bricht damit, dass es passiert. –

Antwort

0

Wenn ein Fall übereinstimmt, wird der nächste Fall fortgesetzt, unabhängig davon, ob der Fall mit der Bedingung übereinstimmt. So werden sie alle schlugen den letzten Fall und der Ausgang wird mit „G“

1

switch und if/else sind etwas austauschbar außer Kraft gesetzt werden, außer für genau das, was break bei einem Schalter ermöglicht. In und if/elseif/elseif/..../else Kette, nur ONE der Blöcke wird jemals ausführen, z.

x = 7; 
if (x == 5) { 
    ... no match, not executed at all 
} else if (x == 7) { 
    .... match made, this is executed 
} else if (x == 7) { 
    ... this will not execute, because the other block already did 
} else { 
    ... this also never executes, because a match was made earlier 
} 

Im Vergleich mit einem switch, sobald eine Übereinstimmung keine weiteren Vergleichstests durchgeführt wird, werden durchgeführt, und alle folgenden Code wird, bis die Schalterblock schließt ausgeführt werden (}) oder ein break angetroffen wird:

x = 7; 
switch(x) { 
    case 5: ... nothing matched, not executed; break; 
    case 7: do_something(); 
    case 8: other_stuff(); 
    case 9: foo(); break; 
    case 7: ... will not execute, because matching stopped above. 
    default: stuff(); 
} 

Hinweis das Fehlen eines break auf der case 7 Linie. Das bedeutet, dass die Ausführung fortgesetzt wird und alle weiteren case Zeilen ignoriert werden. das bedeutet, dass do_something() ausgeführt wird, dann wird other_stuff() ausgeführt und foo() ausgeführt. Schließlich tritt ein break auf, der dieses jetzt lang laufende case beendet, und die Ausführung geht dann weiter mit dem, was nach dem switch kommt.

2

Von MDN

Wenn eine Übereinstimmung gefunden wird, führt das Programm die zugehörigen Anweisungen. Wenn mehrere Fälle mit dem angegebenen Wert übereinstimmen, wird der erste übereinstimmende Fall ausgewählt, auch wenn die Fälle nicht gleich sind.

Die optionale break-Anweisung, die jedem case-Label zugeordnet ist, stellt sicher, dass das Programm nicht mehr wechselt, sobald die übereinstimmende Anweisung ausgeführt wird, und die Ausführung beim folgenden Anweisungsschalter fortgesetzt wird. Wenn break weggelassen wird, setzt das Programm die Ausführung bei der nächsten Anweisung in der switch-Anweisung fort.

So die grundlegende Geschichte über Schalter ist es von C entstanden und ist eine Abstraktion von branch table und eine Verzweigungstabelle hat auch einen impliziten Durchfall und erfordert einen zusätzlichen Sprungbefehl zu vermeiden. Auch alle anderen geerbten Sprachen wechseln als Standard-C-Switch-Semantik und entscheiden sich hauptsächlich dafür, die C-Semantik standardmäßig beizubehalten. Also in Ihrem Schalter, wenn Pause in allen Fällen weggelassen wird, wenn die Übereinstimmung gefunden wird, wird die Ausführung für die nächste Anweisung fortgesetzt. Es gibt den Schalter nicht aus, nachdem die Übereinstimmung gefunden wurde. Stattdessen wertet es alle anderen Fälle unter dem übereinstimmenden Fall aus. als Parser denkt, dass Fälle kombiniert sind, da zwischen ihnen keine Pause besteht. Ich habe Ihren Code ein bisschen für eine klare Erklärung dieses Verhaltens geändert. Im Fall A Pause wird weggelassen.

var dna = "ATTGC"; 
var outArr = []; 
dna.split("").forEach(function(e,i){ 
switch(e) { 
    case "G": outArr[i] = "C"; break; 
    case "T": outArr[i] = "A"; break; 
    case "A": outArr[i] = "T"; 
    case "C": outArr[i] = "G"; break; 
} 
console.log(outArr); 
}) 

So wird Ihre Leistung wie sein

["G"] 
["G", "A"] 
["G", "A", "A"] 
["G", "A", "A", "C"] 
["G", "A", "A", "C", "G"] 

In ersten Iteration Spiel Fall sein wird A.

outArr={'T'} 

Wieder Da es keine Pause Aussage, es wird Fall C als selber Block betrachten und weiterhin dort Ausführung. Jetzt

outArr={'G'} 

Similalrly in der zweiten Iteration passt es für Fall T aber es gibt eine Pause Aussage so Kontrollen aus dem Schalter und outarr springt nun

outArr={'G','A'} 

Ähnliches gilt für andere Iterationen Sie erhalten die gesamte Ausgabe wie oben beschrieben.

Aktualisiert Bin here

Verwandte Themen