2015-06-24 4 views
2
static void Main(string[] args) 
{ 
    string name = null, surname = null; 
    while (name != "A" && surname != "A") 
    { 
     Console.WriteLine("Enter Name:"); 
     name = Console.ReadLine(); // Point A 
     Console.WriteLine("Enter Surname:"); 
     surname = Console.ReadLine(); // Point B 
    } 
    Console.WriteLine("Oops"); 
    Console.ReadLine(); 
} 

Цикл работает отлично:Хотя петля не выходит на ложном состоянии

Output1:

Введите имя:

Джон

Введите Фамилия:

Peter

Введите имя:

Джек

Введите Фамилия:

Эндрю

Выход2: (Попытка перерыва цикл в точке А)

Введите имя:

Цикл // не вышел, но перешел к следующему оператору

Введите Фамилию:

Питера

Нам

Когда я пытаюсь разорвать петлю в точке А, петля не выходит, но переходит к следующему оператору, а затем завершает работу после точка B

Вопрос: Почему он не выходит из цикла в точке и как я могу заставить его выйти в точке A?

ответ

11

Условие цикла проверяется точно, прежде чем вводить весь блок кода не после выполнения каждого оператора в коде. Вы можете добавить условие для выполнения второй части или выйти из цикла или принудительно проверить состояние цикла.

Вырвавшись из цикла:

while (name != "A" && surname != "A") 
{ 
    Console.WriteLine("Enter Name:"); 
    name = Console.ReadLine(); // Point A 
    if (name == "A") 
     break; 
    Console.WriteLine("Enter Surname:"); 
    surname = Console.ReadLine(); // Point B 
} 

Установите условие для выполнения остальной части кода:

while (name != "A" && surname != "A") 
{ 
    Console.WriteLine("Enter Name:"); 
    name = Console.ReadLine(); // Point A 
    if (name != "A") 
    { 
     Console.WriteLine("Enter Surname:"); 
     surname = Console.ReadLine(); // Point B 
    } 
} 

Force, чтобы проверить условие цикла (код после co ntinue не будет выполняться):

while (name != "A" && surname != "A") 
{ 
    Console.WriteLine("Enter Name:"); 
    name = Console.ReadLine(); // Point A 
    if (name == "A") 
     continue; 
    Console.WriteLine("Enter Surname:"); 
    surname = Console.ReadLine(); // Point B 
} 
+4

Они просто завидуют, что вы можете ответить правильно во время сна :) – sstan

+0

Спасибо, ваш первый пример впишется в моем проекте. –

+2

Хотелось бы сказать, что хотя первый пример обеспечивает наиболее быстрое решение, я бы рекомендовал не нарушать цикл. Остальные два примера лучше относятся к долгосрочному обслуживанию и удобочитаемости, а также менее склонны вызывать уклончивые ошибки, если вы решите продлить цикл на более поздний момент времени. – MrPaulch

1
while (true) 
{ 
    Console.WriteLine("Enter Name:"); 
    name = Console.ReadLine(); // Point A 
    if (name=="A") 
    { 
     return; 
    } 
    Console.WriteLine("Enter Surname:"); 
    surname = Console.ReadLine(); // Point B 
    if (surname=="A") 
    { 
     return; 
    } 
} 
1

условие проверяется только в момент, когда весь код в то время цикла было обработано. Так что все работает нормально.

0

Вы можете изменить свой цикл.

while (true) 
{ 
    Console.WriteLine("Enter Name:"); 
    name = Console.ReadLine(); // Point A 
    if(name =="A") 
     break; 
    Console.WriteLine("Enter Surname:"); 
    surname = Console.ReadLine(); // Point B 
    if(surname == "A") 
     break; 
} 
0

Условие цикла проверяется только каждый раз, когда тело цикла полностью выполнено. Если вы хотите, чтобы вырваться из петли вы можете изменить значение break ЗАЯВЛЕНИЯ

static void Main(string[] args) 
{ 
    string name = null, surname = null; 
    while (surname != "A") 
    { 
     Console.WriteLine("Enter Name:"); 
     name = Console.ReadLine(); // Point A 
     if (name == "A") 
     { 
      break; 
     } 
     Console.WriteLine("Enter Surname:"); 
     surname = Console.ReadLine(); // Point B 
    } 
    Console.WriteLine("Oops"); 
    Console.ReadLine(); 
} 
0

Цикла будет проходить через все инструкции, прежде чем он перепроверяет условие цикла.

Вы можете заставить его выйти в точке A с помощью оператора if, чтобы проверить, является ли имя «A» или «a», а затем использовать команду break, если она имеет значение true.

if(name == "A" || name == "a") break;

Смежные вопросы