2016-12-20 3 views
2

Ich habe ursprünglich versucht, die Do While-Schleife zu verwenden, hatte aber dieselben Ergebnisse wie die while-Schleife. Der Benutzer muss eine Nummer 28 - 31 eingeben. Beim ersten Versuch, wenn der Benutzer den Wert korrekt eingeben würde, würde er mit dem nächsten Teil des Codes fortfahren. Wenn der Benutzer jedoch einen falschen Wert eingibt, wird er nach einer Zahl fragen, aber egal, was er eingibt, er wiederholt sich.Warum läuft meine while-Schleife weiter, auch wenn der Wert wahr ist?

#include <cs50.h> 
#include <stdio.h> 

int main(void) 
{ 

    printf("Days in month: "); 
    int daysInMonth = GetInt();  

    while (daysInMonth < 28 || daysInMonth > 31) 
    { 

     printf("Days in month: "); 
     int daysInMonth = GetInt(); 

     printf("%i\n", daysInMonth); 

    } 

    printf("Pennies on the first day: "); 
    int pennies = GetInt(); 

    while (pennies < 1) 
    { 

     printf("Pennies on the first day: "); 
     int pennies = GetInt(); 

    } 

} 

Die printf-Anweisung war Zwecke für die Fehlersuche zu testen, ob daysInMonth den Wert Neuzuordnung.

+3

Warum werden 'daysInMonth' und' pennies' erneut deklariert? –

+3

Die Deklaration des automatischen Objekts 'daysInMonth' innerhalb der' while() '- Schleife überschattet die Deklaration des gleichnamigen automatischen Objekts außerhalb der Schleife. – EOF

+0

Es tut mir leid, dass ich die Zeit verschwendet habe, ich versuche nur zu lernen. – TooDumbForThis

Antwort

13

Im ersten while, Sie haben:

int daysInMonth = GetInt(); 

Dies ist ein definiert neue Variable daysInMonth, lokal für die while ‚s Körper, die die äußere Variable mit dem gleichen Namen verbirgt . Also, in der Zustand der while Schleife, verwenden Sie die äußere daysInMonth, in den Körper, verwenden Sie die innere daysInMonth.

Ich denke, Sie möchten den int Teil aus dieser Zeile entfernen und nur die äußere daysInMonth ändern.

Eigentlich haben Sie die gleiche Situation in der zweiten while Schleife.

+0

Ich habe beide repariert, vielen Dank! Ich habe definitiv davon gelernt, und es tut mir leid, dass ich deine Zeit verschwendet habe. Ich werde die Antwort in 5 Minuten markieren. – TooDumbForThis

+0

@TooDumbForThis - Gern geschehen, wir sind alle hier um zu helfen :) Ich bin froh, dass ich Ihnen geholfen habe, das Problem zu verstehen, so lernen wir alle neue Dinge. Viel Glück :) –

4

TL: DR Sie haben zwei verschiedene Variablen daysInMonth im Code genannt, mit sich überschneid Umfang, die das Problem verursacht.

Sie haben das gleiche Problem mit pennies Variable auch.


Um dies näher auszuführen,

int daysInMonth = GetInt(); 

schafft einen (eine andere) Variable, die mit dem Schleifenkörper while lokal ist. Er überschattet die äußere daysInMonth Variable, so dass sich der Wert bei der bedingten Prüfung niemals ändert. Ändern zu

daysInMonth = GetInt(); 

innen die while Schleifenkörper.

c11 Zitiert, Kapitel §6.2.1, Scopes von Identifikatoren

[...] Wenn der declarator oder Typbezeichner, der den Identifikator erklärt erscheint innerhalb eines Blockes oder in der Liste von Parametern Deklarationen in eine Funktionsdefinition, hat die Kennung Block Umfang, der am Ende der zugeordneten Block endet. [...]

und

[...] Wenn eine Kennung zwei verschiedenen Einheiten in dem gleichen Namen Raum bezeichnet, überlappen sich die Bereiche könnten. Wenn dies der Fall ist, wird der Bereich einer Entität (der innere Bereich) strikt vor dem Bereich der anderen Entität (dem äußeren Bereich) enden. Innerhalb des inneren Gültigkeitsbereichs bezeichnet der Bezeichner die Entität, die im inneren Gültigkeitsbereich deklariert ist. Die im äußeren Bereich deklarierte Entität ist im inneren Bereich verborgen (und nicht sichtbar).

Verwandte Themen