В чем разница между логическими операторами &
и &&
в MATLAB?В чем разница между & и && в MATLAB?
ответ
Единственный амперсанд & является логическим оператором И. Двойной амперсанд & & снова является логическим оператором AND, который использует короткое замыкание. Короткое замыкание просто означает, что второй операнд (правая сторона) оценивается только тогда, когда результат не полностью определяется первым операндом (левая сторона)
& В (А и В, оцениваются)
A & & B (B оценивается только в том случае, если A истинно)
Оба являются логическими операциями И. Однако & & является оператором «короткого замыкания». Из документов MATLAB:
Они являются операторами короткого замыкания, поскольку они оценивают свой второй операнд только тогда, когда результат не полностью определяется первым операндом.
Подробнее here.
& & и || short circuit Операторы, работающие на скалярах. & и | всегда оценивайте оба операнда и работайте с массивами.
Как и другие языки, '&' является логическим побитовым оператором, а '& &' является логической операцией.
Например (простить мой синтаксис).
Если A = [Правда True False Правда] В = Ложные
& В = [Ложные ложных ложных ложных]
..or, если B = True A & B = [True True False True]
Для '& &' правый операнд вычисляется только в том случае, если левый операнд имеет значение true, а результат представляет собой одно булево значение.
х = (б ~ = 0) & & (A/B> 18,5)
Надежда это ясно.
Как уже упоминалось, &
является logical AND operator и &&
является short-circuit AND operator.Они отличаются тем, как операнды вычисляются , а также является ли или нет работают они на массивах или скаляров:
&
(оператор И) и|
(оператор ИЛИ) может работать на массивах в element- мудрая мода.&&
и||
- варианты с коротким замыканием, для которых второй операнд оценивается только тогда, когда результат не полностью определяется первым операндом. Они могут работать только с скалярами, а не массивами.
&&
и ||
требуется скалярные входы и короткое замыкание. |
и &
принимают входные сигналы и короткое замыкание только в операциях if/while. Для назначения последние не замыкаются.
Для получения дополнительной информации см. these doc pages.
Хорошее эмпирическое правило при построении аргументов для использования в условных операторов (IF, WHILE и т.д.) является всегда использовать & &/|| формы, если нет веской причины не делать этого. Есть две причины ...
- Как уже упоминалось, короткое замыкание поведение & &/|| аналогичен большинству C-подобных языков. То, что сходство/знакомство обычно считается точкой в его пользу.
- Использование & & или || формы силы вы должны написать полный код для определения вашего намерения для векторных аргументов. Когда a = [1 0 0 1] и b = [0 1 0 1], есть & b true или false? Я не могу вспомнить правила для MATLAB's &, не так ли? Большинство людей не могут. С другой стороны, если вы используете & & или ||, вы FORCED, чтобы написать код «в полном объеме», чтобы разрешить это условие.
Делая это, вместо того, чтобы полагаться на разрешение от Matlab векторов в & и |, приводит к коду, который имеет немного более многословным, но намного безопаснее и проще в обслуживании.
+1, но следует отметить, что ваш ответ применим только к случаям, когда вы ** хотите ** конечный результат операции быть скаляром.Существует много применений для & и | где && и || бесполезны, потому что они не могут возвращать массивы, например, когда делают фантастическую индексацию, например «выбирая все r между 1 и 2:« r ((r <2) & (r <2)) '. –
Хорошо, Джонас. Я думал об условностях, а не о «логической индексации» (термин MATLAB для «причудливого индексации», который вы упомянули), когда я это написал. Я изменил первое предложение своего сообщения, чтобы это отразить. Спасибо за напоминание! –
Предостережение: '&' может работать на массивах, но '&&' может работать только на скалярах. – gnovice
Сторона примечания: после 15 лет работы с Matlab почти ежедневно я всегда использую '&', и он никогда не укусил меня в задницу. OTOH, я знаю многих людей, которые раздражаются с помощью «&&», потому что они должны помнить, что это не универсально (да, я понимаю, что «&» не так эффективен, потому что он не замыкается на короткое замыкание, но я почти никогда не умерю - цепи мои операнды, поэтому сбережения в настоящее время ничтожно). – neuronet
@neuronet это не действительно эффективность, тем более, что она позволяет построить конструкцию, где первое выражение гарантирует условие, без которого второе выражение может вызвать ошибку во время выполнения. например 'd! = 0 && 1/d' vs' d! = 0 & 1/d' - первое гарантирует отсутствие деления на ноль, второе - нет. – Fraser