2016-12-20 3 views
2

Я попытался использовать цикл Do While, но имел те же результаты, что и цикл while. Пользователь должен ввести число 28 - 31. После первой попытки, если пользователь правильно вводит значение, он перейдет к следующей части кода. Однако, если пользователь вводит неправильное значение, он будет запрашивать номер снова, но, независимо от того, что он вводит, он продолжает повторяться.Почему мой цикл while продолжает выполняться, даже когда значение истинно?

#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(); 

    } 

} 

Заявление Printf было для отладки, чтобы проверить, если daysInMonth является переназначение значение.

+3

Почему повторно объявляются 'daysInMonth' и' pennies'? –

+3

Объявление автоматического объекта 'daysInMonth' внутри' while() '-loop затеняет объявление автоматического объекта с тем же именем за пределами цикла. – EOF

+0

Прошу прощения за то, что потратил время на все, я просто пытаюсь умереть. – TooDumbForThis

ответ

13

В первом while, у вас есть:

int daysInMonth = GetInt(); 

Это определяет новая переменная daysInMonth, локальная для телаwhile «s, которая скрывает внешнюю переменную с тем же именем , Итак, в состоянии петли while вы используете внешний daysInMonth, в корпусе вы используете внутренний daysInMonth.

Я думаю, вы хотите удалить часть int из этой строки и просто изменить внешний daysInMonth.

На самом деле, у вас такая же ситуация во второй петле while.

+0

Я исправил их оба, спасибо вам большое! Я определенно узнал об этом, и я сожалею, что тратил ваше время. Я отвечу через 5 минут. – TooDumbForThis

+0

@TooDumbForThis - приветствую вас, мы все здесь, чтобы помочь :) Я рад, что я помог вам понять проблему, вот как мы все узнаем новые вещи. Удачи :) –

4

TL: DR у вас есть два различные переменные с именами daysInMonth в коде, с перекрытием сферы, что создает проблему.

У вас такая же проблема с переменной pennies.


Для разработки,

int daysInMonth = GetInt(); 

создает переменную (другой), который является локальным для тела в while петли. Он затеняет внешнюю переменную daysInMonth, поэтому в условной проверке значение никогда не изменяется. Изменение в

daysInMonth = GetInt(); 

внутри тела while петли.

Цитирование c11, глава §6.2.1, Области применения идентификаторов

[...] Если описатель или спецификатор типа, который объявляет идентификатор появляется внутри блока или в списке параметров объявления в определение функции, идентификатор имеет область действия блока, которая заканчивается в конце связанного блока . [...]

и

[...] Если идентификатор обозначает две разные сущности в одноименной пространстве, прицелы могут совпадать. Если это так, объем одного объекта (внутренний объем) закончится строго перед областью действия другого объекта (внешней области). Внутри внутренней области идентификатор обозначает объект, объявленный во внутренней области; объект, объявленный во внешней области , скрыт (и не отображается) во внутренней области.