if 1 | []
disp('1 | []');
end
if [] | 1
disp('[] | 1');
end
结果为1 | []
。第一个if被执行。
怎么会出现这种行为? 我认为两者都有相同的结果。
答案 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}}无论第二个表达式是什么都是假的,因此结果为假。