まず最初に、関係演算子を含める場合に switch ステートメントを使用することはお勧めできません。
次に、公式リンクに移動します:ステートメントの複数のグループのうち 1 つのグループを実行する - MATLAB switch case else - MathWorks 中国
この部分が核心的な内容です。
ほとんどの人のスイッチの概要をいくつかチェックしてみました。
http://t.csdn.cn/HeMgs上の写真はこのブロガーのまとめにありました。
2 番目の演算子には関係演算子を含めることはできません。
私にとって、そしてほとんどのプログラマーにとって、これは警告です。結局のところ、関係演算子がある場合は、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
この友人も初心者のはずだそうです。しかし、このコードは正常に実行できることがわかりました。? 私は深い考えに陥った。
友人が私にくれたコードを見てみましょう。
ここでエラーが発生していることが分かりますが、なぜこのようなエラーが発生するのでしょうか?
唯一の違いは切り替え後の値です。
何度も試した結果、友人のコードも正常に実行されました。
唯一の違いはスイッチの後の 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语句!虽然最近都在学习一些应用方面的知识,但这也不得不让我想起了一位老师曾说过的一句话:
“基础的就是经典的!”