&& и || vs AND и OR

февраля 27, 2011  |  Published in Ruby, Основы  |  6 Comments

Статья была признана некоректной и отредактирована! Большая благодарность комментаторам, в частности dre3k

До момента написания предыдущего поста, я и не знал, что && и and чем-то отличаются. В комментариях к предыдущему посту я узнал,что отличия существуют, и как оказывается достаточно значительные.

Что за различия?
&& и AND, || и OR одного поля ягоды, они выполняют абсолютно одинаковую функцию, однако имеют такое, несколько скрытое различие, как приоритет выполнения или старшинство. && и || имеют приоритет выше, чем AND и OR и именно на этом различии основываются все особенности работы с каждым из операторов. Давайте рассмотрим как же приоритет выполнения влияет на работу программы:

nil and a || b соответствует nil and (a || b) и мы получим nil
nil && a || b соответствует (nil and a) || b и мы получим b

Еще примеры:

c = 5 and 10 #=> 10
c #=> 5

Данное выражение соответствует выражению: (c = 5) && 10, поскольку у  and приоритет ниже, чем у «=».

c = 5 && 10 #=> 10
c #=> 10

Данное выражение соответствует выражению: с = (5 && 10) , поскольку у && приоритет выполнения выше, чем у «=»

Оператор and можно представить как постфиксный if:

puts "Hello!" if name == "Vladimir!"

идентично:

name == "Vladimir" and puts "Hello!"

Последовательность из OR можно представить как цепочку из «если здесь провал — попробуй это, если и здесь провал — пропробуй это, …», пример:

percent = 30
percent >= 51 or percent = 52

- примерно такой механизм использовали, на последних выборах в Украине.

В Perl и PHP существует такая идиома, как:

do_comthing or die do_something_else

Эту идиому можно реализовать в Ruby не только через unless, но и через or.

От куда взять все эти приоритеты операторов?

Tags:

Responses

  1. dre3k says:

    февраля 27, 2011 at 14:11 (#)

    Я так понимаю основой для твоих рассуждений послужил вот этот пост . Там говорится что, «легче» для восприятия, если понимать and и or как операторы управления потоком выполнения программы. И в идиоматическом руби and и or «должны» выполнять роль модификаторов управления потоком if и unless. Но то что их легче понимать как что-то и они могут использоватся как что-то не делает их чем-то другим чем они есть на самом деле.
    &&,|| и and, or — это идентичные логические операторы операторы которые отличаются только старшинством .

  2. dre3k says:

    февраля 27, 2011 at 14:31 (#)

    >> && и || не управляют ходом выполнения программы, они просто объединяют условия.

    Как я уже говорил разница с and и or только в старшенстве и как следствие в колличестве круглых скобок нужных для достижения идентичного результата.

    nil or puts 'hey!'
    # это тоже самое что и
    nil || (puts 'hey!')
    
    c = 5 and 10  # у оператора = приоритет выше чем у and
    # это тоже самое что и
    (c = 5) && 10 # у оператора = приоритет ниже чем у &&
    
  3. admin says:

    февраля 27, 2011 at 15:17 (#)

    dre3k, вы правы, одной из статей, по которым я разбрался была именно приведенная вами и та цитата взята от туда. Да, операторы отличаются старшинством, но я не смог понять, как это сформулировать, по этому продемонстрировал все на примерах.Наверное, лучше здесь подходит слово «Приоритет». С таблицей, на которую вы сослались, а уже знаком. += имеет приоритет выше, чем and, однако меньше, чем у &&, поэтому можно наблюдать такое вот поведение:

    a, b = 5,10
    a+=5 and b+=10
    a #=> 10
    b #=> 20

    a,b = 5,10
    a+=5 && b+=10
    a #=> 25
    b #=> 20

    Второй пример равносилен a +=(5 and (b+=10)).

  4. Andrew says:

    февраля 27, 2011 at 16:44 (#)

    Боже, что за статейка…

    a == 1 && puts «Ok»
    #SyntaxError: (irb):14: syntax error, unexpected tSTRING_BEG, expecting keyword_do or ‘{‘ or ‘(‘

    Пишут же, что просто парсер запутался, a == 1 && puts(«Ok») и все, при чем тут все последующие измышления?

    > Да, операторы отличаются старшинством, но я не смог понять, как это сформулировать

    Той самой табличкой и формулировать. С примерами. И все.

  5. Rodger says:

    февраля 28, 2011 at 09:39 (#)

    в рекомендациях по стилю рекомендация #1 «Используйте && и || вместо AND или OR»
    как вы сами поняли у этих операторов высокий приоритет, что заставляет нас использовать скобки повсеместно в условиях, что делает их слабо читаемыми. Наверно стоит пересмотреть рекомендации

  6. Duke says:

    октября 22, 2012 at 11:45 (#)

    Я бы ещё добавил то что у && приоритет выше чем у ||.
    А у or и and одинаковый.
    По-моему это очень важно.

    a,b,c = true,false,false
    
    a || b && c # => true выполняется сначала &&
    a or b and c # => false выполняется сначала or
    

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.