Логические операторы: Короткая схема && ||

Логические операции с замыканием накоротко

Синтаксис

expr1 && expr2
expr1 || expr2

Описание

пример

expr1 && expr2 представляет логическую операцию AND, которая использует поведение замыкания накоротко. Таким образом, expr2 не оценен, если expr1 является логический 0 (false). Каждое выражение должно оценить к скалярному логическому результату.

пример

expr1 || expr2 представляет логическую операцию OR, которая использует поведение замыкания накоротко. Таким образом, expr2 не оценен, если expr1 является логический 1 (true). Каждое выражение должно оценить к скалярному логическому результату.

Примеры

свернуть все

Создайте два вектора.

X = [1 0 0 1 1];
Y = [0 0 0 0 0];

Используя операцию ИЛИ короткой схемы с X и Y возвращает ошибку. Операторы короткой схемы действуют только со скалярными логическими условиями.

Используйте any и функции all, чтобы уменьшить каждый вектор до единственного логического условия.

any(X) || any(Y)
ans = logical
   1

Выражение эквивалентно 1 OR 0, таким образом, это оценивает к логическому 1 (true) после вычисления только первого условия, any(X).

Задайте логический оператор, где второе условие зависит от первого. В следующем операторе это не целесообразно оценивать отношение справа, если делитель, b, является нулем.

b = 1;
a = 20;
x = (b ~= 0) && (a/b > 18.5)
x = logical
   1

Результатом является логический 1 (true). Однако, если (b ~= 0) оценивает к false, MATLAB® принимает целое выражение, чтобы быть false и отключает его оценку выражения рано.

Задайте b = 0 и оцените то же выражение.

b = 0;
x = (b ~= 0) && (a/b > 18.5)
x = logical
   0

Результатом является логический 0 (false). Первый оператор оценивает к логическому 0 (false), таким образом, короткие схемы выражения.

Создайте структуру с полями под названием 'File' и 'Format'.

S = struct('File',{'myGraph'},'Format',[])
S = struct with fields:
      File: 'myGraph'
    Format: []

Выражения короткой схемы полезны в операторах if когда это необходимо несколько условий быть верными. Условия могут основываться друг на друге таким способом, которым это только целесообразно оценивать второе выражение, если первое выражение верно.

Задайте оператор if, который выполняется только, когда S содержит пустое поле под названием 'Format'.

if isfield(S,'Format') && isempty(S.Format)
  S.Format = '.png';
end 
S
S = struct with fields:
      File: 'myGraph'
    Format: '.png'

Первое условие тестирует, если 'Format' является именем поля в структуре S. Второй оператор затем тестирует, пусто ли поле Format. Истина второго условия зависит от первого. Второе условие никогда не может быть верным, если первое условие не верно. Поскольку S имеет пустое поле под названием 'Format', оператор body выполняет и присваивает S.Format значение '.png'.

Больше о

свернуть все

Логическое замыкание накоротко

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

Из-за свойств логического AND и OR, результат логического выражения иногда полностью определяется прежде, чем оценить все условия. Логический оператор and возвращает логический 0 (false), если даже единственное условие в выражении является ложным. Логический оператор or возвращает логический 1 (true), если даже единственное условие в выражении верно. Когда оценка логического выражения отключает рано путем обнаружения с одним из этих значений, выражение, как говорят, закоротило.

Например, в выражении A && B, MATLAB® не оценивает условие B вообще, если условие A является ложным. Если A является ложным, то значение B не изменяет результат операции.

Когда вы используете поэлементный & и операторы | в контексте if или выражения цикла whileтолько в том контексте), они используют замыкание накоротко, чтобы оценить выражения.

Примечание

Всегда используйте && и операторы ||, чтобы включить оценку короткой схемы. Используя & и операторы | для замыкания накоротко может привести к неожиданным результатам, когда выражения не оценивают к логическим скалярам.

Была ли эта тема полезной?