2011-11-07 56 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