2013-03-17 6 views
1

У меня есть что-то подобное в одной из моих функций, и оно возвращает false.Условие в выражении if-else вычисляется неправильно

if ((X = ax && Y == ay) || (X == bx && Y == ay) || (X == cx && Y == ay) || (X == ax && Y == by) || (X == cx && Y == by) || (X == ax && Y == cy) || (X == bx && Y == cy) || (X == cx && Y == cy)) 
    return true; 
else 
    return false; 

Однако, если я вызываю функцию с теми же параметрами, но измененный код только для этого, он возвращает true.

if (X == bx && Y == ay) 
    return true; 
else 
    return false; 

Почему это происходит? Условие во втором коде является одним из условий в первом коде, поэтому, если одно из них истинно, оно должно вернуть true, правильно? Я ожидаю, что первое условие вернется.

+5

Я не уверен, если это ваша проблема, но вам не хватает равенства в первом состоянии. – eliot

+0

Не могли бы вы высказать свой фактический код. Я не вижу эту проблему из вашего «что-то вроде этого». –

+0

try 'if ((X == bx) && (Y == by))' для второго случая. В противном случае компилятор, вероятно, будет интерпретировать его как 'if (((X == bx) && Y) == by)' –

ответ

4

= является оператором присваивания, распространенной ошибкой является случайное использование его для сравнения, что также является вашим случаем. В первой части вашего условия: (X = ax && Y == ay) вы меняете значение X, назначая ему ax, что затем влияет на результат остальной части условия.

Также отметим, что:

if (A || B || C || D) 
    return true; 
else 
    return false; 

равно:

return (A || B || C || D); 
+1

+1 для избавления от "return true"! –

5

То, что «=» справа в начале долгого состояния должно быть «==»! Вы назначаете новое значение X, а не просто проверяете его, что приводит к сбою всех других тестов.

+0

Будет ли это исправлять проблему? Почему это может быть ложным? – eliot

+0

Да, см. Второе предложение ответа. –

3
if((X = ax && Y == ay) || //Problem is here 

Вы должны сделать это

if((X == ax && Y == ay) || 

Ваш код неисправного для X = bx и Y = ay, как и в первом случае, значение ax получает назначение в X, который TRUE, но Y не ay, что делает первое сравнение ложным. Все сравнения после этого оцениваются как false, что приводит к сбою первого теста.

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