if子句中逻辑表达式中的值的顺序

时间:2015-05-05 09:15:16

标签: matlab

if 1 | []
    disp('1 | []');
end

if [] | 1
    disp('[] | 1');
end

结果为1 | []。第一个if被执行。

怎么会出现这种行为? 我认为两者都有相同的结果。

2 个答案:

答案 0 :(得分:4)

我会说这很可能是一个解释器导致的错误,尽管MathWorks可能声称它是未定义的行为。

在命令行上,cond1 = 1|[];cond2 = []|1;都评估为[],因为涉及[]的所有操作都会返回[]。由于[]在条件中使用时评估为false,因此如果在if子句中使用,则可以预期两种情况的行为方式相同。

除了阵列式逻辑运算符之外,Matlab还提供短路运算符,如果仅通过查看条件的某些部分来清楚结果,则会停止对条件的评估。在命令行上进行评估,数组式操作1|[]返回[],而短路操作1||[]返回1。请注意[]||1会引发错误,因为短路运算符仅适用于标量条件,除非它永远不必对它们进行求值。

到目前为止,一切都如预期。我怀疑在我们意外的情况下发生的是,解释器在if子句中隐式替换1|[] 1||[],可能是因为操作以标量开头,[]不是数组

如果可能,您应该避免使用[]进行计算,并使用isempty来捕捉潜在的此类情况。

答案 1 :(得分:1)

由于Matlab仅在结果依赖于它时才解释if语句中的逻辑运算。无论第二个表达式是什么,解释1 | X通常都是正确的,因此解释器将采用快捷方式(错误地为X = []。) <{1}}无论第二个表达式是什么都是假的,因此结果为假。