C++ C++;项目赢得';不要进入循环

C++ C++;项目赢得';不要进入循环,c++,for-loop,boolean,C++,For Loop,Boolean,好的,这是我代码中给我带来问题的部分。我想让它做的是接受一个分数,决定它是否是一个有效的分数,然后继续要求一个有效的数字,如果它不是。然而,它甚至不会进入循环,所以。。。。有什么建议吗?我已经做了一点编程,但我还是很新,所以额外的解释很好!这也是我第一次在for循环中使用boolean for (bool b_valid=false; b_valid=false ; ) { cin >> n_grade; b_valid = true; if (n_grade>100

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

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;
        }
}
for(bool b_valid=false;b_valid=false;)
{
cin>>n_级;
b_valid=true;

如果(n|u grade>100 | n|u grade您的条件是赋值:
b|u valid=false
。它将计算为false,循环将永远不会执行。您的意思是

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

有一种编码风格要求比较中的常量是第一个参数,比如
if(false==b_valid)
。在这种情况下,如果您不小心键入了=,您会得到一个编译器错误。在任何情况下,如果您编写了一个布尔表达式扩展的赋值,许多编译器都会发出警告。要么您的赋值不符合标准,要么您只是忽略了警告。

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

for (bool b_valid=false; false==b_valid; )
与相同(范围除外)

让我们为您的代码这样做:

bool b_valid=false;
while (b_valid = false) { // uh-oh
我们不必再进一步了。这是一个赋值,不是一个比较。它将
b_valid
设置为false,然后检查它是否为true。因为它从来都不是,所以循环永远不会运行

但您真正想要的是
执行
/
循环:

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);
boolbu有效;
做{
cin>>n_级;

如果(n|u grade>100 | n|u grade相等比较运算符是
=
。现在您的条件是
b|u valid=false
,它只返回
false

,我恭敬地不同意其他(不幸地被高估)答案

不要将布尔值与
true
false
进行比较

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

只需测试值本身。也就是说,写入
!b_valid

此外,在此处使用
for
循环显然会产生误导。请使用
while

while (! b_valid) {
    …
}

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

所以你的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;   
   }
}
bool b_valid=false;
cin>>n_级;
而(!b_有效){

如果(n|u grade>100 | n|u 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;
    }
}
bool b_valid=false;
而(!b_有效)
{
cin>>n_级;
b_valid=true;

如果(n|grade>100 | n|grade>100 | n| grade你是说你的程序告诉你它甚至没有进入这个for循环?因为这就是问题标题所说的,但我并不真正理解你的问题。你是在使用gcc吗?如果我输入900,90,900,90,900,90,900,90(无限),你应该用
-Wall
编译代码永远不会终止。你扔掉了一半的输入。没错,好眼力!在我运行了几次程序后,虽然在将=切换为a==,但我还是能够弄清楚这一点!尽管如此!我还注意到,在我重新输入数字后,如果它不是0-100,那么我还有另一个输入,我必须无缘无故地进行,所以我也修复了它!如果您阅读编译器生成的警告,它会告诉您这是错误的。请确保编译时没有警告(警告是编译器告诉您代码中有逻辑错误的方式)。同时将警告级别设置为高于默认值。编译器很少会就这种情况发出警告。通常,当控制条件涉及赋值并需要隐式转换为布尔值时,会出现警告。这里的条件已经是布尔值。Rant on:我鄙视这种编程标准。真的鄙视它。on pr在我对标准有影响力的项目中,这条规则就消失了。在我没有影响力的项目中,我忽略了这条规则(并告诉我的团队成员也这样做),让评审员见鬼去吧。最终这条规则被删除。@Ben:“这里的条件已经是布尔值了”:这里的变量已经是布尔值了。不要将布尔值与真或假进行比较。@David:我想这就是为什么警告会有这样的逻辑——没有人会意外地分配一个布尔变量,而不是将它与真或假进行比较,因为没有人将它与真或假进行比较,他们只是测试它。这是一个合理的假设,除了犯错误的程序员也不明白布尔值可以直接用作条件,或者不知道逻辑求反运算符。这种编码方式在十年前就被弃用了(真是太可怕了)这会使代码更难阅读。所有编译器都会为此生成警告。只需将编译器设置为“编译”以将警告视为错误(因为它们确实是逻辑错误,需要进行修复),现在,如果您忽略了这一点,您的代码将不会编译。但在for循环中,它将运行一次总是太正确了?至少在for的情况下是这样(bool b_value:b_value==false;)对吗?@Samurai:Right。控制变量可以命名为
rainbow
,它也可以工作。由于所有三个循环在技术上都是等效的,因此该选择采用了一个表达性组件,该组件记录了未来开发人员的意图。在本例中,do while是正确的,因为意图是一致的“这样做;在输入无效时重复”。似乎有很多建议使用while循环。while循环更好是有原因的吗?因为它设计为循环直到值变为真,所以比使用for循环更合适……即使你大声说出来,使用while而不是for也更有意义:)与for循环相比,使用while循环还有什么好处吗?这使条件变为反向,当数据无效时循环应该重复,当数据无效时循环退出。谢谢Voigt,愚蠢的错误。@Samurai 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;   
   }
}
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;
    }
}