为什么c++中的if语句不能处理多个条件
Why the if statement does not work with multiple conditions in C++?
我遇到了一个奇怪的问题。由于某些原因,即使用逗号和括号分隔多个||语句也不能工作。我最不希望工作的就是&语句,它需要满足两个条件,但在我的例子中,它只适用于一个条件,就像它是一个OR语句一样。
谁能给我解释一下为什么会发生这种事?我很困惑。:
#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();
}
}
}
if(*m != ' ' || *m != ',' || *m != '?' || *m != '.') // DOES NOT WORK
你期望它做什么?你问的是某物不是A还是不是B。其中任何一个总是为真(只要A和B不是相同的东西),所以你的表达式作为一个整体总是为真。
看起来你可能想要:
if(*m != ' ' && *m != ',' && *m != '?' && *m != '.')
如果*m
是除空格、逗号、问号或句号以外的任何,则该条件为真。
您应该使用&&
作为逻辑"answers"。
&
运算符用于按位"answers",在您的情况下产生true
,因为语句中的所有字符至少有一个公共位点亮。
你想做什么?
请注意,如果目的是过滤掉",? "字符,那么正确的做法是使用&&
,因为||
不会这样做(因为每个字符至少适合一个,所以您永远不会进入else
子句,始终转到then
)。
或者查看第一个,如果不匹配,则转到下一个并检查,否则执行代码。所以如果m是' ',它将通过第一个测试,但第二个测试将通过,因为' '不是','。
我希望你真正想要的是这样的内容:
if (!(*m == ' ' || *m == ',' || *m == '?' || *m == '.'))
您应该使用&&
而不是&
,因为&&
是逻辑运算符,而&
是位运算符。
当涉及if测试时,您需要记住操作符是如何工作的。
使用逻辑OR (||
)意味着如果一个条件为真则整个语句为真。
使用逻辑AND (&&
)意味着如果所有条件为true则整个语句为真。
有关c++操作符的帮助,请参阅本页。下面大约一半是关于逻辑和位操作的部分。
编辑:希望这个代码示例将帮助您澄清困惑:
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
. . . .
}
相关文章:
- 基于多个条件处理地图中的所有元素
- 在通知提升间处理条件变量时未按住锁会导致问题
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- 当线程处理不同的类时,应该在哪里声明条件变量、互斥对象
- 如何处理以 2D 数组编写的条件
- 智能指针自定义删除器中的处理条件
- 处理核心转储条件
- 如何检查和处理前提条件
- absl::Mutex 的条件关键部分如何处理读取器唤醒
- C++,sqlite3.当 BLOB 字段用作查询条件时如何处理它?
- 如何处理 IF 中的多个 OR 条件
- 在C 中处理Boost线程条件
- VS2010 未正确处理预处理器条件下的"includes"
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- 使用try-Catch异常处理程序和if-else条件检查之间的区别
- c++编译器如何处理在条件语句中声明的类型
- 在初始化成员变量期间有条件地处理异常
- OpenMP:如何处理全局std向量上的种族条件
- 具有已定义宏的 iOS 预处理条件会导致"token is not valid"
- 在预处理条件中使用布尔字面值是否有效?