while循环何时检查其状态

本文关键字:状态 检查 何时 循环 while | 更新日期: 2023-09-27 17:58:25

嗨,我有这样的东西:版本1:

bool noErrors = true;
while(noErrors)
{
   noErrors = ValidateControl(txtName);
   // other code
}

版本2:

bool noErrors = true;
while(noErrors)
{
   if(!ValidateControl(txtName)) break;
   // other code
}

我使用此代码来验证表单,如果验证返回false,我希望在执行"其他代码"之前中断。由于我不知道循环何时检查其条件,所以我不知道哪个更有意义。我应该使用第一个版本还是第二个版本,或者第三个版本?

感谢您抽出时间

while循环何时检查其状态

版本2将在运行//other code之前中断。版本1直到下一次迭代开始才会进行检查。

bool noErrors = true;
while(noErrors) 
{    
    noErrors = ValidateControl(txtName);     
    // other code 
}

每次迭代前进行检查。

bool noErrors = true;
do 
{    
    noErrors = ValidateControl(txtName);     
    // other code 
} while(noErrors);

每次迭代后进行检查。

在迭代过程中都不进行检查。正如其他回答者所说,下面的代码简化了示例,但让我提出了一个问题,txtName的有效性是否可能在循环执行过程中发生变化?其他一些限制条件会更有用吗?

while (ValidateControl(txtName)) 
{
    // other code 
} 

如果txtName的有效性不会改变,则考虑

if (ValidateControl(txtName))
{
  while(/*Some other condition*/)
  {
      // other code
  }
}

只有在任何可能的迭代开始时才会检查条件。因此,在版本1中,即使在正文的第一行中将noErrors设置为false,也会执行"其他代码"。。。而在版本2中,它不会。。。但是CCD_ 5在版本2中看起来有些无用。

你能把它改成:吗

while (ValidateControl(txtName))
{
    // other code
}

while循环在第一次迭代之前评估其条件,并在每次后续迭代之间评估。从不在循环体内部评估条件。

它在再次运行之前(第一次、第一次运行之后等等)对其进行检查。你必须中断,否则整个代码块就会运行。

while循环在遍历其前面的代码块之前检查条件。您也可以使用do-while构造使其检查末尾的条件。你的版本#2将产生你想要的结果。

while循环在执行整个代码块之前检查条件。如果要在执行other code之前中断执行,请使用版本2。

循环条件仅在每个循环开始时计算,因此在第一个版本中,即使ValidateControl返回false,"其他代码"仍将执行。

您的第二个版本运行得更好,如果ValidateControl返回false,将不会运行"其他代码",但如果验证失败,它也不会将noErrors设置为false。如果这并不重要,并且noErrors只是循环条件,那么您还可以将while循环更改为while(true),如果代码稍后使用,那么您需要稍微更改版本2:

bool noErrors = true;
while(noErrors)
{
    if(!ValidateControl(txtName))
    {
        noErrors = false;
        break;
    }
    // other code
}

如果这是在验证例程中,我甚至不会使用WHILE()构造。。。在过去,我通常会测试每一个特定的验证例程,这些例程就是这样做的。。。不涉及诸如之类的循环

Function bool IsAllDataValid()
{
    if ( ! (ValidateControl(txtName) )
        return false;
    if ( ! (ValidateControl(OtherField ))
        return false;
    etc...
    return true;
}

然后你就不必担心包含或绕过某些代码块的混合在哪里了。。。你本可以。。。

if IsAllDataValid()
{
   Do Your Other Code
}