2014-08-31 115 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,直到輸入的字符正確。

相關問題