浅谈matlab中的switch使用中包含关系运算符(><=)的问题

首先我先声明,不建议在包含关系运算符的时候使用switch语句!

然后上官方的链接:执行多组语句中的一组 - MATLAB switch case otherwise - MathWorks 中国

这部分是核心内容。

我又去查了大部分人的一些switch的总结:

http://t.csdn.cn/HeMgs上面这个图在这位博主的总结里找的。

其中第二条,不能包含关系运算符。

对于我以及我认为的大多数编程者来说,是认可这一条注意事项的。毕竟如果有关系运算符用if可以很好的解决。

但是,如果强行这样使用呢?

问题就在这个时候出现了。博主本人也是由于一位初学matlab的好朋友问我相关的问题,然后我自己又发现了问题,才有了这篇文章。

我的朋友使用了switch,并且包含了关系运算符,出现了问题。原本我以为确实不能这样使用。

结果我看到了这篇文章:http://t.csdn.cn/zcpmX

syms n
month = input('月份是:')
switch 1<= month && month<=12 && mod(month,1)==0
    case 1 <= month && month <= 3
      n='在春天里'
    case 4<= month && month <= 6
        n='夏天的风'
    case 7<= month && month<= 9
        n='桂花飘香十里香'
    case 10<= month && month<=12
        n='汤圆汤圆卖汤圆'
end

看上去这位朋友应该也是一位初学者。但是我发现这段代码是能够跑成功的!?我直接一整个陷入了沉思。

再看看我朋友给我的代码:

这里可以发现是出现了错误,但为何会出现这样的错误呢?

唯一的区别就是switch后面的值。

在经过多次尝试后,我朋友的代码也能成功跑了:

唯一的区别就是switch后面的n

原来的代码是switch n,更改为n>0后,程序能跑成功了。

那么问题就出在这里。

从官方文档可以看到,case中对于数字,case_expression == switch_expression,case的结果才为true。这句话可不止看上去的那么简单。

我们将这段语句单独拿出来看:

这里的逻辑运算结果为0

这里的逻辑运算结果为1,即我们想要的结果true。

其实从逻辑运算的角度来讲就很明确了,n是一个值,如果和他比较的值跟他一样,那么这个结果就为1,否则就为0。

对于(n>=0 && n<35),在完成这个运算之前,他已经是一个布尔值(boolean)了,即1或者0,所以两者是不能相互比较的。

搞懂了这个逻辑的底层关系,其实就能很好的理解switch语句中的问题了。

n = input('请输入PM2.5的数值:');
switch n >= 0
    case n>=0 && n<35
        disp('优')
    case n>=35 && n<75
        disp('良')
    case n>=35 && n<115
        disp('轻度污染')
    case n>=115 && n<150
        disp('中度污染')
    case n>=150 && n<250
        disp('重度污染')
    otherwise
        disp('严重污染')
end

当switch后面的语句段(switch_expression)为数值时,case后面的语句段(case_expression)也应该为数值,这样的比较才有意义。而上面这个代码中,case_expression的数据类型已经是布尔值了,那么需要与他进行比较的switch_expression也必须是布尔值。在这个地方修改后的n>=0,也是一个布尔值,这样两者的比较才有意义。

那么一件很有趣的事情就发生了,判断能否进入某一条case字段的依据,就成了case_expression是否为true,从某种意义上而言与switch的值没有了联系(比如上面这个例子,我们默认n>=0,即默认switch_expression为真,那么判断case_expression == switch_expression是否为真,就只需要判断case_expression是否为真即可)。

那既然这样申明这个switch的意义何在呢?是不是就用if,elseif语句段来的更直接一些呢?


所以最后,博主花费了2h来向大家证明,并且再次强调还是不建议在包含关系运算符的时候使用switch语句!虽然最近都在学习一些应用方面的知识,但这也不得不让我想起了一位老师曾说过的一句话:

“基础的就是经典的!”

猜你喜欢

转载自blog.csdn.net/weixin_47723114/article/details/128796220