2017-04-18 4 views
0

Ich habe einige Missverandanding angetroffen. Es gibt einen für den Zyklus mit einigen if-Anweisungen:für Zyklus und wenn Aussagen

for (var number = 1; number < 100; number++) { 
    if (number % 3 == 0 && number % 5 == 0) 
    console.log(number + "fizzbuzz"); 
    if (number % 5 == 0) 
    console.log(number + " buzz"); 
    if (number % 3 == 0) 
    console.log(number + " fizz"); 
    else console.log(number); 
} 

Der Ausgang dieses Codes ist 1, 2, 3 Fizz, 4, 5 Summen, etc. Also es ist, was erwartet wird. Aber wenn wir Klammern löschen die Ausgabe wie folgt sein:

15fizzbuzz 
30fizzbuzz 
45fizzbuzz 
60fizzbuzz 
75fizzbuzz 
90fizzbuzz 
100 buzz 
100 

Auch gibt es eine zweite Durchführung dieses Programms (mit dem rechten Weg if-else-Anweisungen):

for (var number = 1; number < 100; number++) 
    if (number % 3 == 0 && number % 5 == 0) 
    console.log(number + "fizzbuzz"); 
    else if (number % 5 == 0) 
    console.log(number + "buzz"); 
    else if (number % 3 == 0) 
    console.log(number + "fizz"); 
    else console.log(number); 

Hinweis dass es auch keine Klammern gibt, aber die Ausgabe ist in Ordnung. Können Sie erklären, was ist der Unterschied?

+5

Nicht Ihre Frage, aber ** immer Hosenträger verwenden **. Sie werden dadurch viele dumme Bugs verhindern. – Carcigenicate

+0

Und zeigen Sie den Code für die zweite Ausgabe. – Carcigenicate

+0

@NinaScholz ugh. Warum können Sie ... – evolutionxbox

Antwort

1

Wenn Sie ein Semikolon oder Klammern verpassen, versucht Javascript, es selbst einzufügen, & kann manchmal einige seltsame Ergebnisse wie diese produzieren.(Die durch die Regeln richtig ist, Menschen nur & Maschine nicht einverstanden sind, wie sie verarbeiten: D)

Wenn Sie Klammern von for Schleife entfernen javascript versucht Klammern in Code & Lauf bringt es, das anders ist, dass wie Sie erwarten, dass es sich so verhält, sind Sie verwirrt!

Was Sie & Lese schrieb:

for (var number = 1; number < 100; number++) 
    if (number % 3 == 0 && number % 5 == 0) 
    console.log(number + "fizzbuzz"); 
    if (number % 5 == 0) 
    console.log(number + " buzz"); 
    if (number % 3 == 0) 
    console.log(number + " fizz"); 
    else console.log(number); 

Was Javascript tat damit & ausführt: hier

for (var number = 1; number < 100; number++){ //runs loop here 
    if (number % 3 == 0 && number % 5 == 0){ 
    console.log(number + "fizzbuzz"); //prints for first condition 
    } 
} 

//now number is 100! 

if (number % 5 == 0){ 
    console.log(number + " buzz"); //prints for second condition once cause 100%5==0 is true 
} 

if (number % 3 == 0){ 
    console.log(number + " fizz"); 
} 
else{ 
    console.log(number); //prints for this else condition once cause 100%3==0 is false 
} 

die perfekt gültig ist & gibt es keine Fehler oder Fehler!

Dies geschieht, weil, wenn das keine unmittelbare else nach if ist dann beenden Sie Javascript diese Aussage gibt, aber wenn Sie else...if verwenden dann geht es diese Aussage bis wenn eine else oder eine Aussage nicht gefolgt von else

Wenn Sie feststellen, möchte mit dieser Art von Verhalten spielen Google Closure Compiler verwenden, um zu sehen, wie der Code von der Maschine interpretiert wird.

HINWEIS: Wie @carcigenicate in Kommentaren vorschlagen, Verwenden Sie immer Klammern!

1

Wie viele Kommentare darauf hingewiesen, ist es das Fehlen von elnes (oder Blöcke) in Ihrem ersten Code, die es falsch machen.

//a bit shortified to make it clearer 
var a=true,b=true; 
if(a && b){ }// will be executed 
if(a){ } //will be executed 
if(b){} //will be executed 

//vs. 
if(a&&b){}//will be executed 
else if(a){}//else => not executed 
else if(b){}//else => not executed 

Allerdings könnte es besser sein, den Code als ganz repetitiven umstrukturieren:

for (var number = 1; number < 100; number++) 
    console.log(number+ (number % 3 == 0?"fizz":"")+ (number % 5 == 0?"buzz":"")); 

So melden Sie sich die Nummer, wenn ihr ein Vielfaches von 3 add „Fizz“ und wenn ihr ein Vielfaches von 5 add "buzz" ...

1

Die Syntax einer for-Schleife ist for (statementA; statementB; statementC) statementD. Anweisungen können zusammen mit {} gruppiert werden, sodass {statement, statement, ...} verwendet werden kann, wenn eine einzelne Anweisung erwartet wird.

for (var number = 1; number < 100; number++) { 
    if (number % 3 == 0 && number % 5 == 0) 
    console.log(number + "fizzbuzz"); 
    if (number % 5 == 0) 
    console.log(number + " buzz"); 

In diesem Fall statementA ist var number = 1, statementB ist number < 100 und statementC ist number++ und statementDif (number % 3 == 0 && number % 5 == 0) console.log(number + "fizzbuzz") ist. Die zweite if ist eine weitere Anweisung, die nicht zur for-Schleife gehört. Wenn Sie möchten, dass die zweite Anweisung if zur for-Schleife gehört, müssen Sie {} verwenden, um die Anweisungen zusammenzufassen.

Die Syntax einer if-Anweisung lautet if (expression) statement oder if (expression) else statement. Mit mehreren if else ausgerichtet sind Sie in der Lage, die erste Anweisung an die for-Schleife zu übergeben, die zweite Anweisung wird zu der ersten if gehören, die immer noch zu der for-Schleife gehört. Deshalb funktioniert das letzte Beispiel ohne {}.

Es ist wichtig zu beachten, dass der Code funktioniert, aber es ist immer noch schlechter Code. Es wird empfohlen, {} zu verwenden, um die Anweisung von unten für for, while und if zu gruppieren, auch wenn es sich um eine einzelne Anweisung handelt.

Bevor Sie versuchen, JavaScript-Code zu verstehen, möchten Sie vielleicht die JavaScript-Syntax lernen. https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps