为什么if语句不适用于C ++中的多个条件?

时间:2011-11-07 00:25:23

标签: c++ if-statement conditional-statements

我遇到了一个奇怪的问题。由于某种原因多个||语句,即使除以逗号和括号也不起作用。我期望工作的最后一件事是&声明,它要求满足两个条件,但在我的情况下,它适用于一个条件,就好像它是一个OR语句。

有人请向我解释为什么会这样。我很困惑。

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();
    }
}
}

4 个答案:

答案 0 :(得分:7)

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

您期望这样做?你问的是某些东西是不是A或者其中任何一个都是真的(只要A和B不是同一个东西),所以你的表达总是真的。

看起来你可能想要:

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

如果*m是除空格,逗号,问号或句号以外的任何,则该条件为真。

答案 1 :(得分:3)

您应该使用&&作为逻辑“和”。

&运算符用于按位“和”,在您的情况下会产生true,因为语句中的所有字符都至少有一个公共位点亮。

你想做什么?

注意,如果打算过滤掉“,?”。字符,然后正确的做法是使用&&,因为||不会这样做(因为每个字符至少适合一个,所以你永远不会进入else子句,总是去then)。

答案 2 :(得分:1)

或者看第一个如果它不匹配则进入下一个并检查它否则执行代码。因此,如果m'''它将在第一次测试中失败,但第二次测试将通过''不是','。

我希望你真正想要的是:

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

答案 3 :(得分:1)

您应该使用&&而不是&,因为&&是一个逻辑运算符,其中&是一个按位运算符。

当涉及到测试时,您需要记住操作符的工作方式。

使用逻辑 OR ||)表示如果条件的一个 true ,则整个语句为true。

使用逻辑 AND &&)表示如果所有条件 true ,则整个语句为true。

有关C ++运算符的帮助,请参阅this page。大约一半是关于Logical和Bitwise操作的部分。

编辑:希望此代码示例有助于消除您的困惑:

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
  . . . .
}