2014-08-31 76 views
-1
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,也会输出与请输入正确值相同的输出。为什么不比较?为什么它会为每个值提供相同的输出?

+1

这里不需要'goto' ...当它不使代码更简单时避免'goto'是IMO的好习惯。 – GingerPlusPlus 2014-08-31 14:07:19

回答

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

这是true在世界上每一个n。您可能打算使用&&

想想看:

  • 如果n == 'C',则条件,因为n != 'S'满足,
  • 如果n == 'S',则条件,因为n != 'C'满意,
  • 如果n == 'X',则满足条件自n != 'C',
  • ...

查看更多about short circuit evaluation

+0

但是,如何检查给定的输入是否与'C'或'c'或's'或'S'不同。 ? – user3776323 2014-08-31 13:47:42

+0

@ user3776323您使用'&&'而不是'||'。你想检查这个角色是不是'C' **并且**不是'S'。 – 2014-08-31 13:51:07

+5

顺便说一句,你应该尽可能避免goto声明,因为它的使用可能导致sphagetthi代码 – TheMasterMaind 2014-08-31 13:56:58

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,则字符是正确的,并且在任何OTH在这种情况下,必须输入一个新字符。

另一方面,goto语句只能用于excepcional的情况下,当程序的流程变得非常紧迫时,一个真正需要“跳出混乱”。

然而,程序非常简单,并且可以用正常的循环控制的句子来实现,如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,直到输入的字符正确。

相关问题