虽然循环在错误条件下不会退出

时间:2015-06-24 13:24:43

标签: c# .net while-loop

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

循环工作正常:

  

输出1:

     

输入姓名:

     

约翰

     

输入姓氏:

     

彼得

     

输入姓名:

     

杰克

     

输入姓氏:

     

安德鲁

     

输出2 :(尝试在A点打破循环)

     

输入姓名:

     

//循环没有退出但是转到了下一个声明

     

输入姓氏:

     

彼得

     

糟糕

当我尝试在A点打破循环时,循环不会退出,但转到下一个语句然后在B点之后退出

问题:为什么它不会在点退出循环,如何让它在A点退出?

6 个答案:

答案 0 :(得分:13)

在进入整个代码块之前,将完全检查循环条件,而不是在代码中的每个语句执行之后。您可以添加条件来执行第二部分或中断循环或强制检查循环条件。

突破循环:

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
    }
}

强制检查循环条件(继续后的代码不会执行):

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
}

答案 1 :(得分: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;
    }
}

答案 2 :(得分:1)

仅在处理了while循环中的所有代码时才检查条件。所以一切正常。

答案 3 :(得分:0)

您可以更改循环块。

⌘ ~/Documents/foo/foo/ (foo-550) git checkout master
error: The following untracked working tree files would be overwritten by checkout:
    application/models/foo_nrds_model.php
Please move or remove them before you can switch branches.
Aborting


⌘ ~/Documents/foo/foo/ (foo-550) git status
On branch foo-550
Your branch is up-to-date with 'origin/foo-550'.

nothing to commit, working directory clean

答案 4 :(得分: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();
}

答案 5 :(得分:0)

循环将在重新检查循环条件之前完成所有指令。

您可以使用if语句检查名称是否为" A"或" a"然后使用break命令,如果它的计算结果为真。

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