C++程序不会进入循环

C++ Program won't enter for loop

本文关键字:循环 程序 C++      更新时间:2023-10-16

好吧,这是我的代码中给我带来问题的部分。我想让它做的是接受一个分数,决定它是否是一个有效的分数,如果不是,则不断要求一个有效数字。然而,它甚至不会进入循环,所以……有什么建议吗?我已经编程了一段时间,但我还是很新,所以额外的解释很棒!这也是我第一次在for循环中使用布尔值。

for (bool b_valid=false; b_valid=false ; )
{
cin >> n_grade;
b_valid = true;
    if (n_grade>100 || n_grade<0)
        {
            cout << "Invalid grade: Re-enter a number between 0-100 : " << endl;
            cin >> n_grade;
            b_valid = false;
        }
}

您的条件是一个赋值:b_valid=false。它的计算结果将为false,循环将永远不会执行。你的意思是

for(bool b_valid = false; b_valid == false; )
                                 ^^^^ 

有一种编码风格要求将比较中的常量作为第一个参数,如if(false == b_valid)。在这种情况下,如果不小心键入了=,则会出现编译器错误。在任何情况下,当您编写了一个布尔表达式的赋值时,许多编译器都会发出警告。要么你的没有那么挑剔,要么你只是忽视了警告。

我恭敬地不同意其他答案(遗憾的是,投票支持率很高)。

不要将布尔值与truefalse进行比较

这是荒谬的、多余的,会导致错误(就像你的情况一样)。

只需测试价值本身。即写入! b_valid

此外,在这里使用for循环明显具有误导性。改为使用while

while (! b_valid) {
    …
}

您在循环条件('=')中使用了赋值,它应该是'===':

for (bool b_valid=false; false==b_valid; )
for( a; b; c ) { body; }

与相同(范围除外)

a;
while (b) {
   body;
   c;
}

让我们为您的代码做这件事:

bool b_valid=false;
while (b_valid = false) { // uh-oh

我们不必再往前走了。这是一项任务,而不是比较。它将b_valid设置为false,然后检查它是否为true。因为它从来都不是,所以循环永远不会运行。

但您真正想要的是do/while循环:

bool b_valid;
do {
    cin >> n_grade;
    if ( n_grade>100 || n_grade<0 ) {
        cout << "Invalid grade: Re-enter a number between 0-100 : " << endl;
        // let the next pass through the loop re-read n_grade
        b_valid = false;
    }
    else {
        b_valid = true;
    }
} while (!b_valid);

do while循环总是至少运行一次。

相等比较运算符是==。现在您的条件是b_valid=false,它只返回false

=是赋值运算符
==是比较运算符

所以你的for循环约束没有检查任何东西。。。

或者使用while循环:

bool b_valid = false;
cin >> n_grade;
while(!b_valid){
   if(n_grade>100 || n_grade<0) {
      b_valid = true;
   } else {
      cout << "Invalid grade: Re-enter a number between 0-100 : " << endl;
      cin >> n_grade;   
   }
}

您可以将代码重构为while循环。例如:

bool b_valid = false;
while( !b_valid )
{
    cin >> n_grade;
    b_valid = true;
    if (n_grade>100 || n_grade<0)
    {
        cout << "Invalid grade: Re-enter a number between 0-100 : " << endl;
        cin >> n_grade;
        b_valid = false;
    }
}