2013-07-03 5 views
1

У меня есть два условия, ShouldCheckForErrors и HasErrorsКак правильно пропустить шаг, если 2 условия

Мой код

if(ShouldCheckForErrors && HasErrors) 
{ 
    //Do nothing 
} 
else 
{ 
    PassTest() 
} 

Я чувствую, что это очень longwinded чек. Не существует способа, которым я могу сделать один чек без использования else?

Например:

if(!ShouldCheckForErrors && !HasErrors) 
{ 
    PassTest() 
} 

не работает, потому что это не назвать PassTest() когда ShouldCheckforErrors является true, но HasErrors является false. (И наоборот)

Мне просто кажется, что я забываю что-то с помощью своих логических операторов.

ответ

8

Вы ищете De Morgan's Law:

if (!ShouldCheckForErrors || !HasErrors) 

Выражаясь иначе:

Вы должны пройти либо, если нет ошибок, или если мы не проверки ошибок.

+0

в соответствии с первым кодом (который длиннее), pass означает, что * оба из них являются истинными, это не * или *, а * и *. – Tigran

+0

@ Тигран: Это не так, как работает отрицание. http://en.wikipedia.org/wiki/De_Morgan%27s_laws – SLaks

+0

Это хороший способ. Теперь я не уверен, как компилируется ответ @Adil, но я думаю, что оба условия проверяются там, где здесь, 'HasErrors' не будут проверяться, если'! ShouldCheckForErrors' оценивают 'true' –

5

Использование не оператор ! после получения результата обоих условий

if(!(ShouldCheckForErrors && HasErrors)) 
{ 
    PassTest(); 
} 
+0

Не видел это прежде, чем я отправил +1 – SpaceghostAli

+1

Очень чистый, но я решил пойти с '' для предотвращения вызова второе условие излишне (ShouldCheckForErrors || HasErrors!!) , – JHixson

2

Ваша логика откусил

!ShouldCheckForErrors && !HasErrors 

не то же самое, как

!(ShouldCheckForErrors && HasErrors) 

который является то, что Я считаю, что вы хотите

1

Simpler случай -

if(theOnlyCheck) { 

} 
else { 
    do(); 
} 

Вы, кажется, достаточно здравого смысла, чтобы сократить этот чек -

if(!theOnlyCheck) { 
    do(); 
} 

Но вы просто испортите ваш порядок операций.

Замещение (check1 && check2) для theOnlyCheck. Не забывайте скобки:

if(!(check1 && check2)) { 
    do(); 
} 

Теперь, если вам не нравится дело с этими скобками вы можете следовать закону Де Моргана: !(a && b) такая же, как !a || !b. Подумайте об этом через себя, чтобы увидеть -

if(!check1 || !check2) { 
    do(); 
} 
Смежные вопросы