2016-03-26 1 views
2

Dies ist nur eine allgemeine Frage.Wenn Sie Pausen in die if-Anweisungen setzen müssen, warum müssen wir uns mit den Bedingungen in der while-Operation beschäftigen?

Ich schrieb dieses ursprünglich

do 
    { 
     scanf("%i", &Carselect); 
     if (Carselect == 1) 
     { 
      mass = 1100; 
      velomax = 200; 
     } 
     else if (Carselect == 2) 
     { 
      mass = 1888; 
      velomax = 415 
     } 
     else if (Carselect == 3) 
     { 
      mass = 18000; 
      velomax = 129; 
     } 
     else 
     { 
     printf("Error in input. Please enter 1, 2 or 3.\n"); 
     } 
    } 
    while (Carselect != 1 || Carselect != 2 || Carselect != 3); 

und bekam ich in der Schleife stecken. Ich habe Brüche in den Erklärungen für die gültigen Bedingungen und das erlaubt mir zu bekommen, wie diese

do 
    { 
     scanf("%i", &Carselect); 
     if (Carselect == 1) 
     { 
      mass = 1100; 
      velomax = 200; 
      break; 
     } 
     else if (Carselect == 2) 
     { 
      mass = 1888; 
      velomax = 415; 
      break; 
     } 
     else if (Carselect == 3) 
     { 
      mass = 18000; 
      velomax = 129; 
      break; 
     } 
     else 
     { 
     printf("Error in input. Please enter 1, 2 or 3.\n"); 
     } 
    } 
    while (Carselect != 1 || Carselect != 2 || Carselect != 3); 

aber ich dachte, dass die Bedingungen für während waren Wiederholungsbedingungen, um so schnell wie Carselect gleich 1, 2 oder 3 Es wird die Schleife verlassen. Wenn Sie Pausen in die if-Anweisungen setzen müssen, warum müssen wir uns dann mit den Bedingungen in der while-Operation beschäftigen?

Was gibt es, auf der Maschinenebene oder anders, die diese scheinbar triviale Logik benötigt?

+2

'||' Wechsel zu '&&' – BLUEPIXY

+0

Ernsthaft? Ich habe eher eine AND-Bedingung als eine ODER-Anweisung gesetzt. Erschieß mich jetzt bitte Ja, das hat funktioniert –

+0

Schau dir den Titel an. Sehen Sie sich gültigen Code in Arbeitsprogrammen/Beispielen an. Sieh dir den Titel noch einmal an. Warum ist der Titel falsch? – user2864740

Antwort

6

Edit (wie die Titel der Frage geändert wird):

Der Prüfzustand in den while/do-while-Schleife derjenige ist, der in erster Linie geprüft, um zu bestimmen, ob das Programm in bleiben oder zu erhalten aus der while/do-while-Schleife - nicht die break-Anweisung.

Die break-Anweisung wird normalerweise verwendet, wenn:

  1. Sie aus dem während bekommen/do-while-Block vor es jede Aussage in dem Block oder
  2. , wenn bestimmte außergewöhnliche ausführt Abbruchbedingung wird erreicht, bevor Sie die gesamte Schleifeniteration durchlaufen oder
  3. Sie erstellen eine Endlosschleife und Sie erfassen einen Fehler, die Sie nicht in der Lage macht die Schleife oder
  4. Einige andere anderen Fällen fortzusetzen, die ich nicht bewusst sein könnte ...

Im Wesentlichen bruch Anweisung nicht normalerweise verwendet wird, die während zu beenden/tun -während blockieren, solange das Programm folgt (aus Mangel an besseren Begriff) "Standard/Main" Pfad im Loop-Block.

Dagegen Zustand in der while/do-while-Schleife wird verwendet, um die Schleife zu beenden, wenn das Programm "Standard/main" -Pfad in den Block-Schleife folgt.

Original:

Sie sollten Ihre Ungleichheit Prüfung (!=) in NOT Gleichheitsprüfung (==) ändern.

while (!(Carselect == 1 || Carselect == 2 || Carselect == 3)); 

Dies liegt daran, was Sie wirklich wollen, ist für die Schleife so lange fortzusetzen, wie

die Carselect ist nicht (1 oder 2 oder 3)

Alternativ könnten Sie Ändern Sie den Operator oder (||) in den Operator und (&&), was zu derselben Logik führt:

while (Carselect != 1 && Carselect != 2 && Carselect != 3); 

die Carselect nicht 1 und nicht 2 und nicht 3

+0

In der Tat. ('Nicht 1 ODER nicht 2 ODER nicht 3' wird immer wahr sein.) –

+0

Wahr, weil eine Zahl nicht drei Werte gleichzeitig haben kann. – Ian

+0

Ich habe rückwärts darüber nachgedacht. –

0

In C Pause Sie sofort auf die Erklärung nimmt folgende} des umschließenden Blocks und weiterhin Sie nimmt bis auf die Erklärung unmittelbar nach {des enthaltenen Blocks. Beide sind nützlich in einem langen Block, zum Beispiel, wenn eine Fehlerbedingung auftritt, oder wenn eine einfachere Eingabe erkannt wird und nicht die gesamte Verarbeitung des vollständigen Blocks erforderlich ist, aber Sie möchten fortsetzen und die nächste Eingabe abrufen.

+0

Wenn Sie ** sonst ** verwenden, ist das ** switch/case ** Konstrukt besser lesbar. –

+0

Mit Respekt schlagen wir vor, (1) dass dies gemäß den Kommentaren zur Frage selbst eine falsch durchdachte while-Bedingung war, und (2) dass die Schleife hier zum Abfangen ungültiger Eingaben dient und keine Hauptschleife ist. –

Verwandte Themen