2011-03-30 84 views
1

爲什麼這樣嗎?或不等於

#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
string s="a"; 
if((s=="cm")||(s=="in")||(s=="ft")||(s=="m")) 
     cout<<s+" Is an illegal value"; 
else 
     cout<<"I like "+s; 
     return 0; 
} 

http://ideone.com/7pnYh

但隨後這並不

#include <iostream> 
#include <string> 
using namespace std; 
int main(){ 
string s="a"; 
if((s!="cm")||(s!="in")||(s!="ft")||(s!="m")) 
     cout<<s+" Is an illegal value"; 
else 
     cout<<"I like "+s; 
     return 0; 
} 

http://ideone.com/TXUXA 我想兩個答案是 「我喜歡」。

+0

爲什麼你會期望第二個給「我喜歡」?只需追蹤它:「a」!=「cm」?是。 「a」!=「in」?是。 「a」!=「ft」?是。 「a」!=「m」?是。 (s!=「cm」)或(s!=「in」)或(s!=「ft」)或(s!=「m」)?是。 – 2011-03-30 11:31:16

+0

多麼尷尬,你是對的,我不應該指望「我喜歡」,謝謝大家的回答。 – 2011-03-30 11:45:12

回答

3

在你的第二種情況下s != "cm",當然第一個cout被打印出來。否定的檢查,並保持相同的邏輯,像這樣做:

if((s!="cm")&&(s!="in")&&(s!="ft")&&(s!="m")) 
     cout<<"I like "+s; 
else 
     cout<<s+" Is an illegal value"; 
1
(s!="cm")||(s!="in")||(s!="ft")||(s!="m") 

每個人和每個人都是真的,所以清楚的表達是真實的。

1

爲什麼第二個輸出「我喜歡」? 第二個例子中聲明中的每一個條件都是真的,所以它進入if分支。即使只有一個是真的,它仍然會進入if分支,因爲你正在使用OR。

1

你嘗試檢查它是否不等於所有這些字符串,而不是它是否不等於這些字符串的任何

使用而不是

+0

正確,但他也必須交換'couts'。 – 2011-03-30 11:33:01

+0

他不是,他期望它評估爲假。也許如果(!((s!=「cm」)&&(s!=「in」)&&(s!=「ft」)&&(s!=「m」)))是他正在嘗試做什麼? – ssteinberg 2011-03-30 11:33:24

+0

@ssteinberg - 我認爲是。可以添加一個額外的'!'或交換'couts'。 – 2011-03-30 11:34:09

1

否定更改它背後的邏輯。這裏有更多的理論http://en.wikipedia.org/wiki/Negation但基本上,在第二個例子中,你要檢查沒有條件匹配 - 這意味着你必須有& &(和)運算符而不是||。 (或)