题目

编写程序,演示数组逐元素逻辑运算 <code>&</code>、<code>|</code>、<code>~</code> 与标量控制流短路运算 <code>&&</code>、<code>||</code> 的严格语法界限与应用场景。

输入格式:无需外部输入。

输出格式:对比展示数组掩码复合运算结果与条件分支短路行为。

数据范围与约定:逻辑运算规范。

思路与算法

1. 数组级逻辑运算符
&(逐位与)、|(逐位或)、~(逐位非)作用于向量或矩阵的每一个对应位置,输出同尺寸逻辑矩阵。例如筛选 $[10, 20]$ 区间的数据必须写成 (v >= 10) & (v <= 20)。

2. 标量短路运算符
&& 与 || 严格只能作用于标量布尔值(1×1),且具备短路求值特性(若左侧为假,右侧表达式绝不执行)。若误对数组使用 &&,在新版 MATLAB 中直接报错,在 Octave 中仅会测试首个元素并发出警告。

3. 括号防御
关系运算符与逻辑运算符混用时,必须给每一项显式加上圆括号,如 (A > 0) & (B < 5)。

完整程序

% Octave / MATLAB 第37题:数组逻辑与标量短路区分
v = [5, 12, 18, 25, 30];

% 1. 数组级逻辑与:筛选在 [10, 25] 区间内的所有元素 (必须用 &)
mask = (v >= 10) & (v <= 25);
in_range = v(mask);

fprintf("原始向量: %s\n", mat2str(v));
fprintf("位于 [10, 25] 的元素 (v(mask)): %s\n", mat2str(in_range));

% 2. 标量短路运算:安全防御测试 (必须用 &&)
denom = 0;
val = 10;
% 如果 denom ~= 0 为假,右侧 val/denom 绝不会被触发执行,安全防御除零
if denom ~= 0 && (val / denom > 2)
    fprintf("条件满足\n");
else
    fprintf("标量短路生效:denom 为 0,跳过右侧求值,成功防崩溃。\n");
end

运行示例

输出:

原始向量: [5 12 18 25 30]
位于 [10, 25] 的元素 (v(mask)): [12 18 25]
标量短路生效:denom 为 0,跳过右侧求值,成功防崩溃。