как протестировать на эквивалентность нескольких переменных в C

Скажите, что я хотел протестировать не всего один, но и несколько переменных для эквивалентности в если оператор:

if(x1==x2==y1==y2){
    printf("Input values shouldn't be equal!");
}

Но это, кажется, не работает. Что другой подход может сделать это?

7
задан Fergus 22 December 2009 в 17:51
поделиться

10 ответов

if (x1 == x2 && x2 == y1 && y1 == y2) { ... }

Результатом выражения a == b будет целое значение либо 0, либо 1. оператор == является лево-ассоциативным, поэтому выражение a == b == c будет вычислено как (a == b) == c, то есть результат a == b (0 или 1) будет сравниваться со значением c. Таким образом, в коде ниже

if (a == b == c) { ... }

выражение вычислит true только если a == b и c == 1 или a != b и c == 0.

.
26
ответ дан 6 December 2019 в 04:47
поделиться
if (x1 == x2 && x1 == y1 && x1 == y2)
{
  printf("Input values shouldn't be equal!");
}
10
ответ дан 6 December 2019 в 04:47
поделиться
if( x1 == x2 && x2 == y1 && y1 == y2 ) { ... }
9
ответ дан 6 December 2019 в 04:47
поделиться

Здесь другой подход, используя вспомогательную переменную ( count_equals), так что легко сделать ( и понять ) именно то, что вы хотите.

int count_equals = 0;
if (x1 == x2) count_equals++;
if (x1 == y1) count_equals++;
if (x1 == y2) count_equals++;
if (x2 == y1) count_equals++;
if (x2 == y2) count_equals++;
if (y1 == y2) count_equals++;

if (count_equals == 0) /* all values are different */;
else if (count_equals == 6) /* all values are equal */;
else /* some values are equal */;
3
ответ дан 6 December 2019 в 04:47
поделиться

Не работает, потому что (x1 == x2), кстати, вычисляется до числа 1, если оно истинно, и 0, если ложно. (x1 == x2 == x3) заканчивается вычислением как ((x1 == x2) == x3).

Думаю, для этого нужно написать свою собственную функцию.

.
0
ответ дан 6 December 2019 в 04:47
поделиться

Ваша проблема - неправильное использование оператора ==. Нужно использовать что-то вроде:

if ((x1 == x2) && (x1 == y1) && (x1 == y2)) {
   printf("Input values shouldn't be equal!"); 
}
-1
ответ дан 6 December 2019 в 04:47
поделиться

Следующий код на Си должен ответить на Ваш вопрос:

if(x1==x2 && x1 == y1 && x1 == y2 && 
            x2==y1 && x2 == y2 &&
             y1 == y2)
{ printf("Input values shouldn't be equal!"); }
  return 0;
}
0
ответ дан 6 December 2019 в 04:47
поделиться

если это целые числа, то можно использовать битовые операции:

if ((x1 & x2 & x3 & x4) == (x1 | x2 | x3 | x4))
  // all are equal

Он вычислит до истинного IFF, что они все одинаковые

.
6
ответ дан 6 December 2019 в 04:47
поделиться

Здесь представлены решения, в основном корректные и понятные.

Но я бы предпочел решение , представленное Саньи Хаттуненом :

цитирует:

if (x1 == x2 && x1 == y1 && x1 == y2)
{
  printf("Input values shouldn't be equal!");
}

Вот причина, по которой:

Хотя в данном конкретном случае это кажется невозможным, оно сразу же заставило меня задуматься о рефакторинге, как в случае с рефакторингом:

(a*b) + (a*c) + (a*d)

, который можно было бы упростить в

a*(b+c+d)

, как уже упоминалось, однако упростить в данном конкретном случае невозможно, поскольку

(a*b) + (a*c) + (a*d)

следует разным математическим правилам, тогда

(a+b) * (a+c) * (a+d)

это как-то связано с коммутационными, ассоциативными и дистрибутивными правилами, если я правильно помню.

1
ответ дан 6 December 2019 в 04:47
поделиться

Вот еще один метод, использующий булевую логику

bool all_equal(false)
all_equal = x1 == x2;
all_equal = all_equal && (x2 == x3);
all_equal = all_equal && (x3 == x4);

Хороший компилятор может это кодировать, используя условные инструкции ассемблера, и не нарушать очередь предварительной установки инструкций.

.
0
ответ дан 6 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: