2009-12-22 2 views
7

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

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

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

+1

Вы имеете в виду, что 1, 1, 1, 1 является недействительным, но 1, 1, 1, 2 действительно, или все они должны быть разными? – Xav

+0

1,1,1,1 недействителен, но действует 1,1,1,2. Только если все переменные установлены в одно и то же значение, это недействительно. – Fergus

ответ

0

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

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

+1

Будет ли исправлять правильное объяснение, но для этого не требуется отдельная функция, может быть сделана встроенная. –

+0

Мой комментарий о функции был для решения общего назначения, т. Е. Проверки N для равенства. Очевидно, вы можете выписать 3-х переменных в ряд. – M1EK

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

+1: Легче понять, что код ищет всех одинаковых. –

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

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

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

Проблема не в приоритете, это то, что '==' не делает то же самое в C, как '=' делает в Lisp. Чтобы заставить его работать таким образом, потребуется больше, чем изменение приоритета. –

+0

Обновлен мой ответ, лучше? –

+0

Намного лучше, спасибо. –

0

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

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

Все, что вам нужно - это 3 теста равенства, ваше булево выражение может быть упрощено;) – AraK

+2

Не нужно проверять все шесть перестановок. –

+2

да, это супер-топ .. но это s НЕ ошибается! – warren

26
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) { ... } 

выражение будет оценивать только истинно, если == Ь и с == 1 или! = Ь и с == 0.

+1

отличная !!! Мне просто хотелось бы добавить еще. – Dave

3

Вот другой подход, с использованием вспомогательную переменную (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 */; 
+0

Очень полезно и наглядно. Thankyou – Fergus

6

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

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

Он оценит истинной МФЛ они все же

+0

действительно приятно! Я думал о чем-то подобном - но вы куда быстрее. – 2009-12-22 20:01:54

1

Решения, представленные здесь, где в основном правильно и легко понять, ,

Но я бы предпочел solution provided by 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

Дополнительные баллы для обобщения. – Fergus

0

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

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

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

Смежные вопросы