2013-05-29 3 views
5

Что равнозначно этому утверждению?И ИЛИ порядок операций

if(cond1 AND cond2 AND cond3 OR cond4 AND cond5 AND cond6) 

Является ли это

if((cond1 AND cond2 AND cond3) OR (cond4 AND cond5 AND cond6)) 

Или

if(cond1 AND cond2 AND (cond3 OR cond4) AND cond5 AND cond6) 

Или

if(((cond1 AND cond2 AND cond3) OR cond4) AND cond5 AND cond6) 

ЭСТ ...

Это га это то, что я всегда испугался, к которому я просто окружаю условия в скобках (). Было бы здорово, если бы мой разум мог быть урегулирован.

+0

Использование скобок неоднозначность отличная идея , –

ответ

9

В большинстве langueges AND оценивается первым, следовательно,

if((cond1 AND cond2 AND cond3) OR (cond4 AND cond5 AND cond 6)) 

- правильный выбор.

Для C#, см http://msdn.microsoft.com/en-us/library/aa691323%28v=vs.71%29.aspx

Для C, см http://en.cppreference.com/w/cpp/language/operator_precedence

Для Java, см http://bmanolov.free.fr/javaoperators.php

+0

_in ** most ** languages_: в котором нет? – inetphantom

0

Это зависит исключительно от языка или среды, о которой вы спрашиваете, что, к сожалению, вы не указали.

AND может иметь более высокий приоритет над OR, иначе это может быть наоборот, или оно может быть равным.

может быть оценена слева направо, справа налево или из середины наружу в переменных направлениях, если ваш язык разработан садиста :-)

Это весьма характерно для AND иметь более высокий приоритет, чем OR, и для них оба должны быть слева-направо ассоциативными.

В этом случае

cond1 AND cond2 AND cond3 OR cond4 AND cond5 AND cond 6 

было бы эквивалентно:

((cond1 AND cond2) AND cond3) OR ((cond4 AND cond5) AND cond 6) 
1

В обычном наборе логических связок (с логической точки зрения), and выше, приоритет, чем or, поэтому A or B and C действительно A or (B and C). Wikipedia перечисляет их в порядке. Большинство языков программирования должны подчиняться этому соглашению, если они не являются действительно странными.

Тем не менее, для конкретного языка или среды должна быть возможность состряпать очень небольшой тест, чтобы удовлетворить себя, что это один из способов или другой :)

9

Хороший способ запомнить это думать об этом математически.

  • AND в * (умножить)
  • OR в + (капельной)
  • TRUE в 1
  • FALSE в 0

Так думать об этом как простую математику вы получите это:

  • 0 * 0 = 0
  • 1 * 0 = 0
  • 1 * 1 = 1
  • 0 + 0 = 0
  • 1 + 0 = 1
  • 1 + 1 = 1

Единственное, что может быть чуть-чуть запутанным является 1 + 1 = 1, но немного не может идти выше 1.

Так с этим в виду, вы можете применить эту логику:

if(cond1 AND cond2 AND cond3 OR cond4 AND cond5 AND cond6)

становится:

if(cond1 * cond2 * cond3 + cond4 * cond5 * cond6)

См: https://en.wikipedia.org/wiki/Order_of_operations

+1

Это действительно классный способ думать о булевых операциях, и он работает как бонусная мнемоника, чтобы запомнить порядок операций. Brilliant. Благодаря! –

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