MATLAB で switch を使用する際の関係演算子 (><=) の使用の問題についての簡単な説明

まず最初に、関係演算子を含める場合に 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语句!虽然最近都在学习一些应用方面的知识,但这也不得不让我想起了一位老师曾说过的一句话:

“基础的就是经典的!”

Supongo que te gusta

Origin blog.csdn.net/weixin_47723114/article/details/128796220
Recomendado
Clasificación