2017-01-13 4 views
1

В заявлении if есть сложное условие, и как-то не получается, как я хочу.Сложная заявка на выпуск IF

if (
    (statementA1) || 
    (statementA2) && 
    (statementB) && 
    (statementC) 
) { 
    doSomething 
} 

Оба A1 и A2 не могут быть истинными одновременно (из-за характера фактического заявления). Кроме того, как B, так и C должны оценивать значение true, чтобы обеспечить полное соответствие действительности. Таким образом, только для true false true true и false true true true должно быть возвращено true; любая другая перестановка должна возвращать false.

Заявления находятся в фигурных скобках из-за их внутренней сложности (в том числе Math.abs(), A1 и B имеют внутренние, комбинированные подстанции).

+0

Если приоритет оператора затруднен для вас, вы всегда можете разбить один блок на несколько вложенных. Но да, логический И имеет более высокий приоритет, чем OR. – dfsq

+2

'a || b && c' анализирует как 'a || (b && c) '. – melpomene

+0

Его не слишком сложно, он слишком зациклен на этом вопросе (переписал тот же фейер, что и 3 раза на этой неделе), и на данный момент у меня нет никого, кто мог бы обсудить это. Его довольно отвратительно само по себе, не вставляя ничего внутрь. –

ответ

4

Для

a1 a2 b  c result 
----- ----- ----- ----- ------ 
true false true true true 
false true true true true 
true true true true true <- different from blow 

вы можете использовать это выражение

(a1 || a2) && b && c 

Либо a1 или a2 и b и c.

if ((statementA1 || statementA2) && statementB && statementC) { 
    // doSomething 
} 

Вам нужна скобка из-за operator precedence из logical AND && (6) над logical OR || (5)

Если вы имеете дело

a1 a2 b  c result 
----- ----- ----- ----- ------ 
true false true true true 
false true true true true 
true true true true false <- different from above 

, то вы могли бы использовать это выражение

(!a1 && a2 || a1 && !a2) && b && c 

которые проверяют a1 и a2 отдельно.

if ((!statementA1 && statementA2 || statementA1 && !statementA2) && statementB && statementC) { 
    // doSomething 
} 
+0

A1 частично и A2 полностью ссылаются на одно и то же свойство объекта, содержащее строку, которая имеет логику позади. проверено w с решением нины, и это дало мне правильные результаты. Надеюсь, это не будет проблемой сказать спасибо здесь. –

2

Помните аббревиатуру «Пожалуйста, простите мой дорогой тетя Салли», или PEMDAS, который относится к Скобки, Возведение, Умножение/Деление и сложение/вычитание. Это порядок приоритетов, от более высоких (более жестких) до более низких (более слабых), на многих языках, включая JavaScript.

Вариант «Прошу прощения у моей тети» (PEMA).

Тогда помните, что в логическом мире and является своего рода умножением, а or - это своего рода дополнение. Таким образом, вы можете это вспомнить и (&&) связывается более плотно, чем или (||).

Поэтому, если вы хотите and вместе два условия, один из которых сам по себе or «ИНГ два условия, вы должны скобки последнего:

a && (b || c) 

Без скобок, это будет истолковано как

(a && b) || c 

конечно, в вашем конкретном случае, вы можете избежать беспокоиться о приоритете и скобки, просто писать

a1 != a2 && b && c 
Смежные вопросы