如何让 if() 拆分为 && 而不是 ||

How to have an if() split by && and not ||

本文关键字:拆分 if      更新时间:2023-10-16

我正在尝试在 c++ 中做这样的事情

If x is equal to either a or b or c
and y is equal to either d or e or f
and z is equal to either g or h or i, it would turn true and execute the code

我对此有点迷茫

if(x==a||x==b||x==c && y==d||y==e||y==f && z==g||z==h||z==i){
// Do x
}

只需使用&&||,并用括号使分组清晰。

if ((x == 'a' || x == 'b' || x == 'c') 
&& (y == 'd' || y == 'e' || y == 'f')
&& (z == 'g' || z == 'h' || z == 'i')) {
// execute code
}

如果您查看运算符优先级C++您会发现&&的优先级高于||

这意味着您的if声明

if(x==a||x==b||x==c && y==d||y==e||y==f && z==g||z==h||z==i)

if (x == a || x == b || (x == c && y == d) || 
y == e || (y == f && z == g) || 
z == h || z == i)

通过使用括号,您可以将其更改为按所需方式工作:

if ((x == a || x == b || x == c) && 
(y == d || y == e || y == f) && 
(z == g || z == h || z == i))

>这是你所说的C++代码的简单翻译:

if ((x == a || x == b || x == c) &&
(y == d || y == e || y == f) &&
(z == g || z == h || z == i))
{
}

大多数实际程序都没有如此复杂的条件。将逻辑拆分为逻辑测试。

从前面的答案来看,重要的一点是,在C++中,您错过了 AND 运算符&&的运算符优先级高于 OR 运算符||

这可以与代数中*/%的乘法运算符比加法运算符+-具有更高的优先级进行比较。

重新组合参数,这样你就有了x、y和z必须是什么的这三个要求,当这三个要求都正确时,这个陈述就是真的。(从技术上讲,这被称为求和形式的乘积,因为 if 语句需要所有三个较小语句(AND(的真实性,其中每个较小的语句仅使用 OR 语句。

if((x==a||x==b||x==c) && (y==d||y==e||y==f) && (z==g||z==h||z==i)){
// Do x
}

您的原始代码等效于

if(x==a || x==b || (x==c && y==d) || y==e || (y==f && z==g) || z==h || z==i){
// Do x
}

对于较大的 if 语句,您也可以使用换行符,但当然这会占用更多行。

if((x==a||x==b||x==c) 
&& (y==d||y==e||y==f) 
&& (z==g||z==h||z==i)
&& ... other conditions)){
// Do x
}

如果你不想要这样繁琐而冗长的if语句符号,你可以考虑分解为逻辑测试(if条件是逻辑测试的"产品"(,即

bool a1 = (x==a||x==b||x==c);
bool a2 = (y==d||y==e||y==f);
bool a3 = (z==g||z==h||z==i);
bool a4 ...
if (a1 && a2 && a3 && a4 && ..) {
// Do x
}

尝试使用括号分隔您的问题:

if( (condA || condB || condC) && (condD || condE || condF) && (...)) and so on.
(condA = condition A)

这里有点过火(但只是一点点(:

if (element_of(x, {a, b, c}
&& element_of(y, {d, e, f})
&& element_of(z, {g, h, i}))
{
foo();
}

element_of定义为:

template <class T>
auto element_of(const T& element, std::initializer_list<T> list) -> bool
{
return std::find(list.begin(), list.end(), element) != list.end();
}

或者甚至更过火一点(这只是为了好玩,我不推荐它(:

if (Elem{x}.element_of({a, b, c})
&& Elem{y}.element_of({d, e, f})
&& Elem{z}.element_of({g, h, i}))
{
foo();
}

Elem

template <class T> struct Elem
{
T element;
auto element_of(std::initializer_list<T> list) -> bool
{
return std::find(list.begin(), list.end(), element) != list.end();
}
};
template <class T> Elem(T) -> Elem<T>;