Скажите, что я хотел протестировать не всего один, но и несколько переменных для эквивалентности в если оператор:
if(x1==x2==y1==y2){
printf("Input values shouldn't be equal!");
}
Но это, кажется, не работает. Что другой подход может сделать это?
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.
.if (x1 == x2 && x1 == y1 && x1 == y2)
{
printf("Input values shouldn't be equal!");
}
Здесь другой подход, используя вспомогательную переменную ( 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 */;
Не работает, потому что (x1 == x2), кстати, вычисляется до числа 1, если оно истинно, и 0, если ложно. (x1 == x2 == x3) заканчивается вычислением как ((x1 == x2) == x3).
Думаю, для этого нужно написать свою собственную функцию.
.Ваша проблема - неправильное использование оператора ==. Нужно использовать что-то вроде:
if ((x1 == x2) && (x1 == y1) && (x1 == y2)) {
printf("Input values shouldn't be equal!");
}
Следующий код на Си должен ответить на Ваш вопрос:
if(x1==x2 && x1 == y1 && x1 == y2 &&
x2==y1 && x2 == y2 &&
y1 == y2)
{ printf("Input values shouldn't be equal!"); }
return 0;
}
если это целые числа, то можно использовать битовые операции:
if ((x1 & x2 & x3 & x4) == (x1 | x2 | x3 | x4))
// all are equal
Он вычислит до истинного IFF, что они все одинаковые
.Здесь представлены решения, в основном корректные и понятные.
Но я бы предпочел решение , представленное Саньи Хаттуненом :
цитирует:
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)
это как-то связано с коммутационными, ассоциативными и дистрибутивными правилами, если я правильно помню.
Вот еще один метод, использующий булевую логику
bool all_equal(false)
all_equal = x1 == x2;
all_equal = all_equal && (x2 == x3);
all_equal = all_equal && (x3 == x4);
Хороший компилятор может это кодировать, используя условные инструкции ассемблера, и не нарушать очередь предварительной установки инструкций.
.