本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

逻辑运算符:短路 && ||

具有短路功能的逻辑运算

语法

expr1 && expr2
expr1 || expr2

说明

示例

expr1 && expr2 表示使用短路行为的逻辑 AND 运算。即,如果 expr1 为逻辑值 0 (false),将不计算 expr2 的结果。每个表达式的计算结果都必须为标量逻辑值。

示例

expr1 || expr2 表示使用短路行为的逻辑 OR 运算。即,如果 expr1 为逻辑值 1 (true),将不计算 expr2 的结果。每个表达式的计算结果都必须为标量逻辑值。

示例

全部折叠

创建两个向量。

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

将短路 OR 运算符与 XY 结合使用会返回错误。短路运算符仅用于标量逻辑条件。

使用 anyall 函数将每个向量约简为单个逻辑条件。

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

该表达式等效于 1 OR 0,这样在仅计算第一个条件 any(X) 后该表达式的计算结果为逻辑值 1 (true)。

指定第二个条件依赖于第一个条件的一个逻辑语句。在以下语句中,如果除数 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: []

如果希望多个条件为 true,则可以在 if 语句中使用短路表达式。一个条件可以基于另一个条件构建,在这种情况下,只有第一个表达式为 true 时才会计算第二个表达式。

指定一个仅当 S 包含一个名为 'Format' 的空字段时才会执行的 if 语句。

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

第一个条件测试 'Format' 是否为结构体 S 中某字段的名称。然后,第二个语句测试 Format 字段是否为空。第二个条件是否为真取决于第一个条件。如果第一个条件不为 true,则第二个条件永远不会为 true。由于 S 包含一个名为 'Format' 的空字段,主体语句将执行 S.Format 并为其分配值 '.png'

详细信息

全部折叠

逻辑短路

使用逻辑短路功能时,仅当第一个操作数 expr1 不能完全确定结果时,才会计算第二个操作数 expr2

由于逻辑 AND 和 OR 的属性,有时在计算所有条件之前就可完全确定逻辑达式的结果。即使表达式中只有单个条件为 false,逻辑 and 运算符也会返回逻辑值 0 (false)。即使表达式中只有单个条件为 true,逻辑 or 运算符也会返回逻辑值 1 (true)。如果计算逻辑表达式由于遇到这些值之一而提前终止,则该表达式可以认为是短路

例如,在表达式 A && B 中,如果条件 A 为 false,MATLAB® 将根本不计算条件 B。如果 A 为 false,则 B 的值不会改变运算的结果。

当在 ifwhile 循环表达式的上下文(并且在该上下文中)使用按元素 &| 运算符时,这些运算符使用短路来计算表达式的结果。

注意

应始终使用 &&|| 运算符启用短路评估。当表达式的计算结果不为逻辑标量时,使用 &| 运算符实现短路会产生意外结果。