题目
编写程序,演示数组逐元素逻辑运算 <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,跳过右侧求值,成功防崩溃。