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