2009-09-04 3 views

ответ

82

Единственный амперсанд & является логическим оператором И. Двойной амперсанд & & снова является логическим оператором AND, который использует короткое замыкание. Короткое замыкание просто означает, что второй операнд (правая сторона) оценивается только тогда, когда результат не полностью определяется первым операндом (левая сторона)

& В (А и В, оцениваются)

A & & B (B оценивается только в том случае, если A истинно)

+56

Предостережение: '&' может работать на массивах, но '&&' может работать только на скалярах. – gnovice

+0

Сторона примечания: после 15 лет работы с Matlab почти ежедневно я всегда использую '&', и он никогда не укусил меня в задницу. OTOH, я знаю многих людей, которые раздражаются с помощью «&&», потому что они должны помнить, что это не универсально (да, я понимаю, что «&» не так эффективен, потому что он не замыкается на короткое замыкание, но я почти никогда не умерю - цепи мои операнды, поэтому сбережения в настоящее время ничтожно). – neuronet

+0

@neuronet это не действительно эффективность, тем более, что она позволяет построить конструкцию, где первое выражение гарантирует условие, без которого второе выражение может вызвать ошибку во время выполнения. например 'd! = 0 && 1/d' vs' d! = 0 & 1/d' - первое гарантирует отсутствие деления на ноль, второе - нет. – Fraser

8

Оба являются логическими операциями И. Однако & & является оператором «короткого замыкания». Из документов MATLAB:

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

Подробнее here.

3

& & и || short circuit Операторы, работающие на скалярах. & и | всегда оценивайте оба операнда и работайте с массивами.

5

Как и другие языки, '&' является логическим побитовым оператором, а '& &' является логической операцией.

Например (простить мой синтаксис).

Если A = [Правда True False Правда] В = Ложные

& В = [Ложные ложных ложных ложных]

..or, если B = True A & B = [True True False True]

Для '& &' правый операнд вычисляется только в том случае, если левый операнд имеет значение true, а результат представляет собой одно булево значение.

х = (б ~ = 0) & & (A/B> 18,5)

Надежда это ясно.

11

Как уже упоминалось, & является logical AND operator и && является short-circuit AND operator.Они отличаются тем, как операнды вычисляются , а также является ли или нет работают они на массивах или скаляров:

  • & (оператор И) и | (оператор ИЛИ) может работать на массивах в element- мудрая мода.
  • && и || - варианты с коротким замыканием, для которых второй операнд оценивается только тогда, когда результат не полностью определяется первым операндом. Они могут работать только с скалярами, а не массивами.
24

&& и || требуется скалярные входы и короткое замыкание. | и & принимают входные сигналы и короткое замыкание только в операциях if/while. Для назначения последние не замыкаются.

Для получения дополнительной информации см. these doc pages.

+0

Есть ли у вас информация о том, какие версии Matlab сочетаются с '&' и '' 'в операциях if/while? Это не похоже на R2012b и R2014a. – Tim

+0

@ Loren любая идея * почему * они разработали один для работы со скалярами? Кажется странным ... – neuronet

2

Хорошее эмпирическое правило при построении аргументов для использования в условных операторов (IF, WHILE и т.д.) является всегда использовать & &/|| формы, если нет веской причины не делать этого. Есть две причины ...

  1. Как уже упоминалось, короткое замыкание поведение & &/|| аналогичен большинству C-подобных языков. То, что сходство/знакомство обычно считается точкой в ​​его пользу.
  2. Использование & & или || формы силы вы должны написать полный код для определения вашего намерения для векторных аргументов. Когда a = [1 0 0 1] и b = [0 1 0 1], есть & b true или false? Я не могу вспомнить правила для MATLAB's &, не так ли? Большинство людей не могут. С другой стороны, если вы используете & & или ||, вы FORCED, чтобы написать код «в полном объеме», чтобы разрешить это условие.

Делая это, вместо того, чтобы полагаться на разрешение от Matlab векторов в & и |, приводит к коду, который имеет немного более многословным, но намного безопаснее и проще в обслуживании.

+1

+1, но следует отметить, что ваш ответ применим только к случаям, когда вы ** хотите ** конечный результат операции быть скаляром.Существует много применений для & и | где && и || бесполезны, потому что они не могут возвращать массивы, например, когда делают фантастическую индексацию, например «выбирая все r между 1 и 2:« r ((r <2) & (r <2)) '. –

+0

Хорошо, Джонас. Я думал об условностях, а не о «логической индексации» (термин MATLAB для «причудливого индексации», который вы упомянули), когда я это написал. Я изменил первое предложение своего сообщения, чтобы это отразить. Спасибо за напоминание! –