为什么它为每个值提供相同的输出?

时间:2014-08-31 13:40:17

标签: c++

int main (void)
{
    char n;
    label0:
    cout<<"Please enter a character value(C/S)\n";
    cin>>n;
    n = toupper(n);
    if ( n!= 'C' || n!= 'S' )
    {
        cout<<"Please enter proper value\n";
        cin.clear();
        cin.ignore();
        goto label0;
    }
    else
    {
        cout<<"You entered"<<n<<"\n";
    }
    return 0;  
}  

在此代码中,即使我输入c C s S,它也会输出与输入正确值相同的输出。为什么不进行比较?

2 个答案:

答案 0 :(得分:3)

if ( n!= 'C' || n!= 'S' )

对于世界上的每个true,这是n。您可能打算使用&&

想一想:

  • 如果n == 'C',则自n != 'S'
  • 以来满足条件
  • 如果n == 'S',则自n != 'C'
  • 以来满足条件
  • 如果n == 'X',则自n != 'C'
  • 以来满足条件
  • ...

详细了解short circuit evaluation

答案 1 :(得分:2)

通常,您通过了解逻辑运算符的使用方式而遇到麻烦。

条件n != 'C'相当于!(n == 'C') 因此,代码中的if()条件可以通过以下方式重写:

  if ( !(n == 'C') || !(n == 'S') )

但是,代码中需要的条件是另一个:

  if ( ! (n == 'C' || n == 'S') )

我建议以相反的顺序完成工作:

if ( n== 'C' || n== 'S' )
{
    cout<<"You entered"<<n<<"\n";
}
else
{
    cout<<"Please enter proper value\n";
    cin.clear();
    cin.ignore();
    goto label0;
}

这样,如果输入的字符是c C s S,则字符是正确的,在任何其他情况下,必须输入新字符。

另一方面,goto语句必须仅在特殊情况下使用,当程序流程变得非常内向时,一个人真的需要&#34;跳出混乱&#34; 。

但是,您的程序非常简单,并且可以使用普通的循环控制句子来实现,例如do {} while()

int main (void)
{
    char n;
    do {
        cout<<"Please enter a (proper) character value(C/S)\n";
        cin>>n;
        n = toupper(n);

        cin.clear();
        cin.ignore();

    } while ( ! (n == 'C' || n == 'S') );

    cout<<"You entered"<<n<<"\n";

    return 0;  
}

现在,强制用户输入所需的字符之一:c C s S,直到输入的字符正确为止。