You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含‘or’运算符的if语句交换条件后结果不同的原因

为什么交换条件顺序后MATLAB不再输出yes!?

嘿,这个问题挺有意思的,根源在于MATLAB对空数组和逻辑运算符的特殊处理逻辑,我给你拆解清楚:

首先得明确两个关键知识点:

  • strfind的返回值:找到子串时返回起始索引的非空数组(比如找'hello'在'hello'里,返回[1]);找不到就返回空数组[]。
  • MATLAB的|是逐元素逻辑或,不是短路逻辑或||,它会严格计算两边的结果再做运算,而且对操作数的维度有要求。

现在看两种情况的差异:

第一种情况:if strfind(name,'hello') | strfind(name,'hi')

  • 先算左边的strfind(name,'hello'),得到[1](1x1的标量非空数组)。
  • 再算右边的strfind(name,'hi'),得到[](0x0的空数组)。
  • 执行[1] | []时,MATLAB会尝试把空数组适配成左边标量的维度,但空数组没法直接适配,这时候旧版本的MATLAB会直接返回左边的非空数组[1]。
  • 到了if判断环节:[1]是非空数组,而且所有元素都是非零值,所以判定为真,执行disp('yes!')。

第二种情况:if strfind(name,'hi') | strfind(name,'hello')

  • 先算左边的strfind(name,'hi'),得到[](空数组)。
  • 再算右边的strfind(name,'hello'),得到[1]。
  • 执行[] | [1]时,MATLAB没法把右边的标量适配成空数组的维度,结果返回空数组[]。
  • 到了if判断环节:空数组会被直接判定为假,所以不会执行disp语句。

简单来说,就是|运算符对空数组和非空数组的顺序敏感,不同顺序会返回不同结果,进而影响if的判断。如果想避免这种问题,推荐用短路逻辑或||,或者先把strfind的结果转成是否存在的逻辑值(比如~isempty(strfind(name,'hello'))),这样不管顺序怎么换,结果都是一致的。

内容的提问来源于stack exchange,提问作者Michaël

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:14:38