2011-11-07 55 views
-1

我遇到了一個奇怪的問題。出於某種原因多個||語句,即使用逗號和括號劃分也不行。我期望的最後一件事是&聲明,它要求滿足這兩個條件,但在我的情況下,它適用於一個條件,就好像它是一個OR語句。C++爲什麼if語句不適用於多個條件? 〜除了用&語句

有人請向我解釋爲什麼會發生這種情況。我很困擾。

WORKS:

#include<iostream> 
#include<vector> 
#include<string> 

using namespace std; 


int main() 
{ 
string quest; 

quest = "Where is my dog?"; 

string::iterator m; 
vector<string>question; 

string t; 

for(m = quest.begin(); m != quest.end(); m++) 
{ 
    if(*m != ' ' & *m != ',' & *m != '?' & *m != '.') //works with & and && 

    { 
     t.push_back(*m); 
    } 
    else 
    { 
     cout << t << endl; 
     question.push_back(t); 
     t.clear(); 
    } 
} 
} 

不起作用:

#include<iostream> 
#include<vector> 
#include<string> 

using namespace std; 


int main() 
{ 
string quest; 

quest = "Where is my dog?"; 

string::iterator m; 
vector<string>question; 

string t; 

for(m = quest.begin(); m != quest.end(); m++) 
{ 
    if(*m != ' ' || *m != ',' || *m != '?' || *m != '.') // DOES NOT WORK 
    { 
     t.push_back(*m); 
    } 
    else 
    { 
     cout << t << endl; 
     question.push_back(t); 
     t.clear(); 
    } 
} 
} 
+0

你有什麼期望第二個輸出的,什麼是它的輸出? – Dani

+0

答覆者,請說明兩者1)發生了什麼事,2)如何正確地做。我不會投一半答案。 –

+1

我希望人們不要投我一票,因爲我不明白,即使這是非常愚蠢的事情。 – VSB

回答

1

或者看第一個,如果它不匹配則進入下一個檢查它,否則它執行代碼。所以如果m是'',那麼第一次測試就會失敗,但是第二次測試會通過''不是','。

我希望你真正想要的是沿着線的東西:

if (!(*m == ' ' || *m == ',' || *m == '?' || *m == '.')) 
+0

謝謝你的工作!現在我明白了它爲什麼不起作用:) – VSB

+1

@TechnoViking - 這是一個典型的邏輯轉換的例子:(m!= x)&&(m!= Y)總是等於:! ((m == X)||(m == Y))。閱讀布爾代數,維基百科有一篇文章。 – casualcoder

+0

@casualcoder謝謝!問題是我只在條件成立的時候纔看到它,有時候我們往往會陷入一件事而不能正確分析,我經常做的事情是 – VSB

3

您應該使用&&邏輯 「和」。

&操作是按位「和」,而你的情況產生true因爲在聲明中的所有字符至少有一個共用位點亮

你想要做什麼?

請注意,如果打算過濾出「,?」。字符,那麼正確的做法是使用&&,因爲||不會這樣做(因爲每個字符都至少適合一個字符,所以你將永遠不會進入else子句,總是去then)。

+0

它可以用或完成,你問他們是否相等或相等,並在最後反轉比賽,當然這是相對容易證明的不是或者這與NOT輸入的AND是相同的。 – ewanm89

+0

的確,如果問題是==,那麼運算符應該是|| ||。 – littleadv

7
if(*m != ' ' || *m != ',' || *m != '?' || *m != '.') // DOES NOT WORK 

你會期望做什麼?你在問是否某物不是A或不是B.這兩個物體中的任何一個都是真實的(只要A和B不是同一物),所以你的表情總是如此。

看起來你可能想:如果*m是什麼以外空格,逗號,問號,或週期

if(*m != ' ' && *m != ',' && *m != '?' && *m != '.') 

這個條件會是真的。

+0

它花了我一陣子我終於明白了:) – VSB

-1

哥們因爲沒有與它的虛假陳述是非常非常真實的。嘗試在那裏再次看。

1

您應該使用&&而不是&作爲&&是邏輯運算符,其中&是一個按位運算符。

當談到如果測試,您需要記住操作員如何工作。

使用邏輯OR||)表示,如果條件一個那麼整個聲明是真實的。

使用邏輯&&)表示的條件,如果所有那麼整個聲明是真實的。

有關C++操作員的幫助,請參閱this page。大約一半的時間是關於邏輯和位運算的部分。

編輯:希望這個代碼示例將幫助清理你的困惑:

int A = 0; 
int B = 1; 

if (A == 0 && B == 0) { 
    //This code will not run, as the whole statement is false 
    . . . . 
} 

if (A == 0 && B == 1) { 
    //This code will run, as the whole statement is true 
    . . . . 
} 

if (A == 0 || B == 0) { 
    //This code will run, as A = 0, so the whole statement is true 
    . . . . 
} 
+0

謝謝,這是如此令人困惑啊哈哈,但我現在得到它! – VSB