如果声明所有条件彼此相等

时间:2013-12-05 14:59:53

标签: c if-statement conditional boolean-logic

如果语句中的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;
        }   

但这些都不起作用。

有人可以帮忙吗?

谢谢!

9 个答案:

答案 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 && BA为零,则表达式B将评估为0;如果AB均为非零,则表达式&&将评估为1 。 A && B && C运算符是左关联的,这意味着像(A && B) && C这样的表达式被解析为C; IOW,A && BA[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,因此将CA == 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优化下)