如果语句中的5值相同,我需要if语句才能执行。 例如,如果a [0] = a [1] = a [2] = [a3] = [a4] = 1
这只是一个布尔代数问题,但我无法做到正确。
我试过了:
if( (A[0]) && (A[1]) && (A[2]) && (A[3]) == (A[4]))
{
Flag =1;
}
和
if( (A[0]),(A[1]),(A[2]),(A[3]) == (A[4]))
{
Flag =1;
}
和
if( (A[0]) == (A[1]) == (A[2]) == (A[3]) == (A[4]))
{
Flag =1;
}
但这些都不起作用。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:3)
从布尔逻辑我们得到if A == B AND A == C then B == C
在C / C ++中,您无法组合表达式的评估,因此每个条件都必须单独完成。
所以你可以这样做:
if( (A[0] == A[1] && A[0] == A[2] && A[0] == A[3] && A[0]== A[4])
flag = 1;
如果这是一个数组,你可以在循环中这样做(伪代码):
v = A[0]
flag = 1; // Asume that all are equal.
for(i = 0; i < maxindex; i++)
{
// If one entry doesn't match the whole expression is false.
if(v != A[i])
{
flag = 0;
break;
}
}
答案 1 :(得分:3)
有几个人给了你正确答案;这里解释了为什么你的尝试不起作用。
为什么A[0] && A[1] && A[2] && A[3] == A[4]
无效?
如果A && B
或A
为零,则表达式B
将评估为0;如果A
和B
均为非零,则表达式&&
将评估为1 。 A && B && C
运算符是左关联的,这意味着像(A && B) && C
这样的表达式被解析为C
; IOW,A && B
与A[0] && A[1] && A[2] && A[3] == A[4]
(0或1)的结果进行AND编辑。因此,A[0]
只有在A[3]
到A[4]
的所有内容都为非零和 A[0]
== 1或任何一个时才会评估为真A[3]
到A[4]
的内容为0 和 &&
== 0.另请注意,(A[0]),(A[1]),(A[2]),(A[3]) == (A[4])
运算符不会评估右侧操作数如果左侧操作数为0。
为什么A[3]
无效?
逗号运算符按顺序计算每个表达式,结果是 last 表达式的值,因此只将A[4]
的值与A[0]
进行比较。评估A[2]
到(A[0]) == (A[1]) == (A[2]) == (A[3]) == (A[4])
中的每一个,但结果将被丢弃。
为什么&&
无效?
与A == B
运算符类似,==
的结果将为0或1.与上述类似,A == B == C
运算符是左关联的,因此{{1} }被解析为(A == B) == C
,因此将C
与A == B
的结果进行比较,结果为0或1.因此,如果{{1},上述内容将仅评估为真}和A[0]
相同,A[1]
到A[2]
都相等。
因此,如果要检查多个表达式是否完全等效,则必须编写类似
的内容A[4]
答案 2 :(得分:2)
每次比较都需要单独进行。
if (A[0] == A[1] &&
A[1] == A[2] &&
A[2] == A[3] &&
A[3] == A[4])
{
Flag = 1;
}
答案 3 :(得分:1)
由于这恰好是一个数组,你可以利用它:
const int N = 4;
bool everything_is_equal = true;
for(int i=0; i<(N-1); i++)
{
if(A[i] != A[i+1])
{
everything_is_equal = false;
break;
}
}
根据元素的数量,这可能比使用&&
运算符的long if语句更具可读性。
答案 4 :(得分:0)
我认为最简单的方法是:
if( A[0] == A[1] && A[1] == A[2] && A[3] == A[4] && A[4] == A[5])
答案 5 :(得分:0)
除了布尔语之外,没有通用的方法来写这个速记。您需要执行以下操作:
if (A[0] == A[1] && A[1] == A[2] && ...)
或等效的东西,或将此行为封装在辅助函数中(类似bool areAllTheThingsEqual(T *things, int num)
)。
答案 6 :(得分:0)
将检查是否所有等于A4,这意味着所有5都相等:
if( A[0] == A[4] && A[1] == A[4] && A[2] == A[4] && A[3] == A[4] )
{
Flag =1;
}
答案 7 :(得分:0)
我只想添加一些内容,您可以先研究运营商的优先级; (1)“==”和“&amp;&amp;”哪一个是第一个 (2)可能导致一些编译错误 (3)请注意“==”OPERATOR将返回true或false,您无法将它们连接在一起 如果你想探索,你可以尝试使用xor来解决这个问题
答案 8 :(得分:0)
如上所述,这是通常的方式
if ( A[0] == A[1] && A[1] == A[2] && A[2] == A[3] && A[3] == A[4] )
{
Flag = 1;
}
然而,您的第一次尝试让我想到了一种替代方法,使用按位逻辑运算,因为&
和|
在相等的数字上给出了相同的数字。
但是只要一些数字不同,即某些数字的某些位设置为0而另一个数字设置为1,|
将产生1而&
将在此位置产生0在结果数字中,使它们不同。
if ( (A[0] & A[1] & A[2] & A[3] & A[4]) == (A[0] | A[1] | A[2] | A[3] | A[4]) )
{
Flag = 1;
}
这似乎快了两倍(在-O2
优化下)