1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

プログラミング言語別のswitch文

Last updated at Posted at 2022-01-15

#変更履歴

  • 2022/1/16
  • Rubyの「case in」追加
  • C言語の文字列比較あたりの記述修正
  • まとめの表にbreakの有無追加

#初めに
switch文に初めて触れたのは、業務改善でC言語を使った時です。
場合によってifの分岐より簡潔に記述できるswitch文は好きな処理です

ライブラリが豊富で汎用性があるpythonを使っていて
「switch文なぜなんでないんだ・・・。」と、ずっと引っかかっていました。

そんなことを忘れかけていた中、twitterを見ている時に
pythonのバージョン3.10.0にてswitchと同じ動作をする
matchが追加されていることを、先日知りました。(リリースが2021年10月の様です)

今まで長文まとめるの時間かかるな、そんないい記事書けないなと
アウトプットはすぐ投稿できるTwitterに逃げていましたが
switch文でQiitaデビューしようと思いました、暖かい目でご覧ください

###書くこと

  • match関数とif関数の違い(python)
  • プログラミング言語でのswitch文の違い(C言語・Ruby・VBA)

###書かないこと

  • 言語ごとの深掘り(数値の場合どうなるか等)

###コード内容

  • 色で英語の文字列を日本語で出力
    • 変数名:color
    • colorが"red"の場合、出力は"赤"
    • colorが"white"か"black"の場合、出力は"パンダの色"(複数条件)

コード(GitHub)

動作環境

  • macOS Monterey 12.0.1
  • プログラミング言語のバージョンはそれぞれに記載

#matchとifの違い(python3.10.0)
pythonではmatchとなり、
変数colorの中身によって処理を切り替える。

下の処理はcolorが"black"なので"パンダの色"と出力する。
この様に一つの条件で複数の結果があるような処理を書きやすい

match.py
color = "black"

match color:
    case "red":
        print("")
    case "blue":
        print("")
    case "black" | "white":
        print("パンダの色")
    case _:
        print("その他")

# 出力:"パンダの色"

特徴

  • matchやcaseの後ろに:(コロン)をつける
  • endや breakのように終了を明記しない
  • 「match > case > 処理 」にインデントが必要(つけないとエラーになる)
  • caseが複数ある場合はバーチカルライン|でつなぐ

matchをifで書くと

if1.py
color = "black"

if color=="red":
  print("")
elif color=="blue":
  print("")
elif color=="black" or color=="white":
  print("パンダの色")
else:
  print("その他")

# 出力:"パンダの色"

ifは毎度、条件式(変数名と式)を記述する必要があります。
matchの様に1つの値に複数の判定・処理がある場合、記述が増えます。

ただしifにもメリットがあります。

if2.py
color = "red"
val = 50

if color == "red" and val <= 20:
  print("色は赤で値が20以下です")
elif color == "blue" or val > 20:
  print("色は青であるか値が20を超えています")
else:
  print("その他")

# 出力:"色は青であるか値が20を超えています"

毎回条件式を記述するのでandやorを使うことで
複数の値・条件を指定して判定を組むことができます

以下で別言語のswitch文と特徴を記載します

#C言語(gcc13.0.0)

  • switch文
  • switch→case
  • 一番最初に使ったswitch文
  • ターミナルでgcc switch.cでコンパイル後、./a.outで実行
switch.c
#include <stdio.h>

enum color {
  red,
  blue,
  black,
  white,
};

int main(void){
  enum color color;
  color = black;

  switch(color){
    case red:
      printf("赤");
      break;
    case blue:
      printf("青");
      break;
    case black:
    case white:
      printf("パンダの色");
      break;
    default:
      printf("他の色");
  }

  return 0;
}

// 出力:"パンダの色"

##特徴

  • 文字列の比較、他の言語の様にできない
  • caseの後は数値
  • enumで"black"は2のように文字列を数値をして扱う感じ
  • break;を入れないとcaseが一致していない処理も実行される
  • 複数条件はcaseを重ねる

#Ruby 【case when】 (2.6.5)
RubyはCase文(case→when)

ruby
color = "white"

case color
  when "red"
    print("赤")
  when "blue"
    print("青")
  when "black", "white"
    print("パンダの色")
  else
    print("その他")
end

# 出力:"パンダの色"

###特徴

  • endで終了を書く必要がある
  • インデントなしでも処理できる
  • 複数条件はカンマ(,)

#Ruby 【case in】 (3.0.0)

  • 2.7で導入
  • 簡単な使い方ではcase whenとほぼ同じ
case_in.rb
color = "black"

case color
  in "red" then print "赤"
  in "blue" then print "青"
  in "black" | "white" then print "パンダの色"
  else print ("その他")
end

# 出力:パンダの色

###特徴

  • thenをつけると1行で記述可能(whenも)
  • 複数条件はバーチカルライン(|)

#VBA(Excel for Mac 16.56)

  • Select Case文(Select Case → Case)
  • Rangeを使ってエクセルのA1から値を取得
  • 右隣のB1に出力
VBA
Dim color As String
color = Range("A1")

Select Case color
    Case "red"
        Range("B1") = "赤"
    Case "bule"
        Range("B1") = "青"
    Case "white", "black"
        Range("B1") = "パンダの色です"
    Case Else
        Range("B1") = "その他"
End Select

' 出力:"パンダの色"

###特徴

  • End Selectで閉じる
  • インデントはなしでも動作する
  • 複数条件はカンマ(,)

#まとめ

言語ごとの書き方・動作

言語 開始 条件 break 終了 インデント 複数条件記述
python match color: case なし なし 必要 バーチカルライン(|)でつなぐ
C switch(color){ case あり 必要(}) 不要 caseを複数行で記述
Ruby case color when なし 必要(end) 不要 カンマ(,)でつなぐ
Ruby case color in なし 必要(end) 不要 バーチカルライン(|)でつなぐ
VBA Selece Case Case なし 必要(End Select) 不要 カンマ(,)でつなぐ

###思ったこと

  • 改めて言語によって記述方法、できることに違いがあるということがわかった
  • 新たにC言語をPCで動作させることができる様になった
  • コメントで不足してるところを補ってもらえた
  • 言語化してまとめるのは難しい(言語をまたぐと特に)

#最後に
記事にするのは大変だけど、記事にするために動かすだけでなく
どうしてこうなるのかとか、他に方法がないかなど調べることで
知識の幅を増やすことができました

またQiita投稿しようと思います!

1
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?