как проверить на эквивалентность нескольких переменных в C - PullRequest
7 голосов
/ 22 декабря 2009

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

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

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

Ответы [ 10 ]

26 голосов
/ 22 декабря 2009
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.

10 голосов
/ 22 декабря 2009
if (x1 == x2 && x1 == y1 && x1 == y2)
{
  printf("Input values shouldn't be equal!");
}
9 голосов
/ 22 декабря 2009
if( x1 == x2 && x2 == y1 && y1 == y2 ) { ... }
6 голосов
/ 22 декабря 2009

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

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

Это даст оценку истинному IFF, что они все одинаковы

3 голосов
/ 22 декабря 2009

Вот другой подход, использующий вспомогательную переменную (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 */;
1 голос
/ 22 декабря 2009

Представленные здесь решения в основном правильные и простые для понимания.

Но я бы предпочел решение от Sany Huttunen :

цитировал:

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)

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

0 голосов
/ 23 декабря 2009

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

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

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

0 голосов
/ 22 декабря 2009

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

if(x1==x2 && x1 == y1 && x1 == y2 && 
            x2==y1 && x2 == y2 &&
             y1 == y2)
{ printf("Input values shouldn't be equal!"); }
  return 0;
}
0 голосов
/ 22 декабря 2009

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

if ((x1 == x2) && (x1 == y1) && (x1 == y2)) {
   printf("Input values shouldn't be equal!"); 
}
0 голосов
/ 22 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...