Share to: share facebook share twitter share wa share telegram print page

Switch文

switch文(スイッチぶん、: switch statement)とは、プログラミング言語において、ある式の値に応じて多分岐を行なうである。最適化の仕方にも左右されるが、場合によってはテーブルジャンプなどに展開されることで、条件判断を繰り返すif文よりも効率的に実行されることがある。言語によっては、値を返すとして記述できるものもある。また、検査対象の式のランタイム型(実行時型情報)に応じて分岐するような、複雑なパターンマッチングの機能を持つ言語もある[1]

言語ごとの構文

C言語

構文は以下の通り。

switch (制御式) {
case 値1:
    
    
    ………
    break;
case 値2:
    
    
    ………
    break;
default:
    
}

上記の「case」ラベルはいくつでも記述することができる。caseラベルの「値」はコンパイル時に決まる整定数式 (integer constant expression) である必要がある。

この文は次のような手順で実行される。

  1. 制御式を評価し、整数値を得る。
  2. その整数値がどれかのcaseで指定された値であるなら、そのcaseに引き続く文に飛ぶ。
  3. どのcaseでも指定されていなければ、defaultに引き続く文に飛ぶ。
  4. もしdefaultが記述されていなければ、何も実行せずにswitch文を抜ける。

フォールスルー

ここで注意しなければならないのが、caseはラベルに過ぎず、そのcaseより前からの実行から、そこでswitch文を抜けさせる働きはない点である(一般的には、次のcaseがあらわれる直前にbreak文を置く)。このルールはフォールスルー (fall through) と言い、制御の流れが合流する動作をさせたい場合に便利であるが、一方でbreak文の書き忘れによるバグ、ループを抜けるbreakと取り違える誤読によるバグなど、バグの温床として問題視されてきた。

そのためlintでは、意図的にフォールスルーしていることを示す/* FALLTHROUGH */などのコメントが記述されていない限り警告を出す。また、Cに類似した構文を採用した言語でも、C#のように対策(後述)した言語仕様にされていることがある。

上記の例は、if文を羅列することで同様の動作を実現することができる。なおif文では比較対象の「値」が整定数式である必要がない点においてswitch文よりも柔軟である。

_tmp_ = 制御式;
if (_tmp_ == 値1) {
    
}
else if (_tmp_ == 値2) {
    
}

………

else {
    
}

defaultは最後に記述される場合が多いが、必ずしも最後である必要はない。

switchによる分岐は以下のようにdo-while文と組み合わせることも可能である。

switch (count)
{
    default:       do {    printf("%d\n", count); count++;
    case 0:                printf("%d\n", count); count++;
    case 1:                printf("%d\n", count); count++;
    case 2:                printf("%d\n", count); count++;
                   } while (count);
}

例えばDuff's deviceではそのような使われ方をしている。

C#

C#でのswitch文はC言語と似たような見た目であるが、フォールスルーについての挙動は異なる。

switch ()
{
case 0:
case 1:
  // 式が0か1の時に実行
  System.Console.WriteLine("Case 0 or 1.");
  return 1;

case 2:
  System.Console.WriteLine("Case 2.");
  goto case 3: // case 3も実行

case 3:
  System.Console.WriteLine("Case 3.");
  break;

default:
  System.Console.WriteLine("Default.");
  break; // ここのbreakも省略不可
}

C#では、caseラベルは文に付属する扱いとなるが、1つの文に複数のcaseラベルを付けることができる。また、C言語のようなフォールスルーは禁止されており、次のcaseラベル付きの文、あるいはswitchブロックの末端に、通常の制御フローで到達してはならない。すなわち、breakでswitchを抜ける、returnで関数ごと抜ける、例外を投げる、無限ループしてそれ以上進まない[注釈 1]、goto caseするなどの書き方が必要となる[2]。goto caseにより、C言語ではフォールスルーを使って書くことができた、制御の合流を書くことができる。

CやC++では、switch文の制御式には整数型の式、またcaseラベルには整定数式しか使用できないのに対し、C#ではそれぞれ文字列型および文字列リテラルも使用できる。また、整数型あるいは整数型に準ずる値型のnull許容型System.Nullableも使用することができる。

C# 7.0以降では型switchを使用できる。

// C# 7.0以降
switch (obj)
{
    case int num when num < 0:
        Console.WriteLine($"objは負の32bit整数{num}です。");
        break;
    case string str when str.StartsWith("H"):
        Console.WriteLine($"objはHから始まる文字列{str}です。");
        break;
    case string str:
        Console.WriteLine($"objは文字列{str}です。");
        break;
    default:
        Console.WriteLine("objは想定外の型あるいは値です。");
        break;
}

Go

Goでは、caseに複数の値を指定できる。次のcaseの直前にfallthrough文を置くとフォールスルーになる。

PHP

PHPでは、C#と同様、文字列にも、switch文が適用できる。

switch (str) {
    case "ABC":
        文A;
        break;
    case "XYZ":
        文B;
        break;
    case "123":
        文C;
        break;
    default:
        文D;
        break;
}

PHPのswitch文においては、比較が===演算子ではなく==演算子で行われる。そのため、曖昧一致に起因し、開発者が予期しない動作となる場合がある。

BASIC

構造化されたBASICでは、Select Caseステートメントが存在することが多い。このステートメントでは、文字列または整数を対象にできる。

Select Case str
    Case "ABC"
        A
    Case "XYZ"
        B
    Case "123"
        C
    Case Else
        D
End Select
Select Case age
    Case Is < 20
        A
    Case 20 To 29
        B
    Case 30,50,70 'Caseに複数の値を指定することができる
        C
    Case Else
        D
End Select

Cなどと違い、各Caseはラベルではなく、Selectステートメントはフォールスルーでない。

Perl

Perlでは、perl-5.8以降からuse Switchとした上でswitch case文が使えるようになった。それ以前のバージョンのperlに関しては、Perl付属文章perlsynドキュメントのBasic BLOCKs and Switch Statementsの節に書式の例が書かれている。

Ruby

Rubyでは、case式により同様の多分岐ができる。フォールスルーはない。ラベルとして置いたものと条件値は===演算子で比較される[3][注釈 2]ため、これをオーバーロードすることでクラスに応じた一致判定を行うことができる。Ruby自体のクラスライブラリ内でも、正規表現の一致判定[4]、範囲オブジェクトでの範囲内かどうかの判定、オブジェクトがあるクラスに属するかの判定など、各種の定義がなされている。

Mediawiki

Mediawiki系のTemplateにおいては、ParserFunctionsを用いて多分岐をおこなうことができる。一対一の分岐処理の他、複数の値に対して同一の処理を定義する一種のフォールスルーも実現できる。しかし、CやC#といった言語でのreturn文やbreak文が無い。そのため処理の途中でSwitch文を抜けるにはif等の条件文で処理を囲み、実行させないよう制御する必要がある。

詳細については、Help:条件文#switchの項を参照の事。

表計算ソフトウェア

多くの表計算ソフトウェアでは、CHOOSE関数の拡張としてSWITCH関数が利用できる。

例えばMicrosoft Excel 2019以降(Office 365含む)[5]LibreOffice Calc 5.2以降[6]Google スプレッドシート[7]でサポートされている。指定可能なケースと結果値のペアの上限は環境によって異なるが、概ね以下のような構文である。

SWITCH(式, ケース1, 結果値1[, ケース2, 結果値2, ...][, 既定の結果値])
検査される任意の有効な値。
ケース 式に対して比較されるケース。
結果値 ケースが式と一致したときに返される値。
既定の結果値 最後のパラメータとして指定される省略可能な値で、いずれのケースも式と一致しなかった場合に返される。

もし式がどのケースとも一致せず、さらに既定の結果値が与えられていない場合、#N/Aのエラーが返却される。

条件式ベースで使う

Ruby[3]SQL[注釈 3]では、switchに相当する文の後の式が必須ではなく、省略した場合はwhenとして書かれた式のうち、最初に真となるところを実行するようになる。PHPやJavaScriptなど、caseの式が定数である必要性がない言語の場合、switch(true)と書くことで同様の動作を実現できる。

脚注

注釈

  1. ^ むろん、C#コンパイラが停止性問題を解くことはできないため、この扱いはループ条件が定数の場合に限られる。
  2. ^ なお、Rubyの===演算子は、JavaScriptやPHPでのような「厳密に等しい」という意味ではない。
  3. ^ どちらの言語も、switch...caseではなく、case...whenと書く。

出典

関連項目

Read other articles:

Diego Michiels Diego (kanan) bermain untuk Borneo melawan Persija Jakarta pada tahun 2020Informasi pribadiNama lengkap Diego Muhammad bin Robbie MichielsTanggal lahir 8 Agustus 1990 (umur 33)[1]Tempat lahir Deventer, BelandaTinggi 180 m (590 ft 7 in)[2]Posisi bermain DefenderInformasi klubKlub saat ini Borneo FC SamarindaNomor 24Karier junior2006 DVV RDC2007–2009 Go Ahead EaglesKarier senior*Tahun Tim Tampil (Gol)2009–2011 Go Ahead Eagles 17 (0)2011 Pelita…

Chapter of the New Testament Luke 21← chapter 20chapter 22 →The Latin text of Luke 19:7–22:38 in Codex Gigas (13th century).BookGospel of LukeCategoryGospelChristian Bible partNew TestamentOrder in the Christian part3 Luke 21 is the twenty-first chapter of the Gospel of Luke in the New Testament of the Christian Bible. It records the observations and predictions of Jesus Christ delivered in the temple in Jerusalem,[1] and his exhortation to be watchful.[2] The boo…

Energy Nürnberg Hörfunksender (privat) Programmtyp CHR Empfang analog terrestrisch, Kabel, digital Empfangsgebiet Großraum Nürnberg (UKW, DAB) Sendestart 4. Dez. 1995 Sitz Nürnberg Geschäftsführer Markus Schülein, Olaf Hopp Liste von Hörfunksendern Website Energy Nürnberg ist ein privater Hörfunksender aus Nürnberg. Energy Nürnberg sendet auf der UKW-Frequenz 106,9 MHz und im Digitalradio DAB+ (Block 10C) ein ganztägiges Programm. Veranstalter ist die Radio 106,9 MHz Nürnberg…

Situación de las montañas Foja. Las montañas Foja (en indonesio Pegunungan Foja) se encuentran en la isla de Nueva Guinea, en la provincia de Papúa, Indonesia. Se sitúan al sureste de la cuenca del río Mamberamo. Las montañas se elevan hasta los 2.193 m s. n. m., y contienen más de 3.000 km² de selva tropical madura. La extensión total de la selva cubre aproximadamente 9.712 km², haciéndolo el bosque tropical prístino más grande de Oceanía.[1]​ Geografía Esta…

بنجامين أبثورب غولد (بالإنجليزية: Benjamin Apthorp Gould)‏  بنجامين أبثورب غولد معلومات شخصية الميلاد 27 سبتمبر 1824(1824-09-27)بوسطن الوفاة نوفمبر 26, 1896 (عن عمر ناهز 72 عاماً)كامبريدج، ماساتشوستس مكان الدفن مقبرة ماونت أوبورن  الجنسية الولايات المتحدة عضو في الجمعية الملكية،  والأك…

КаламонтеCalamonte Герб {{{official_name}}}ГербМуніципалітетКраїна  ІспаніяАвтономна спільнота ЕстремадураПровінція БадахосКоординати 38°53′24″ пн. ш. 6°23′06″ зх. д. / 38.89° пн. ш. 6.385° зх. д. / 38.89; -6.385Координати: 38°53′24″ пн. ш. 6°23′06″ зх. д.…

Saint‑Armand Municipio Saint‑ArmandLocalización de Saint‑Armand en Quebec Coordenadas 45°02′00″N 73°03′00″O / 45.0333, -73.05Entidad Municipio • País Canadá • Provincia  Quebec • Región Montérégie • MRC Brome-MissisquoiEventos históricos   • Creación 3 de febrero de 1999[1]​Superficie   • Total 82.88 km²Población (2011)   • Total 1248 hab.[2]​ • …

Fusion of the nuclei of two haploid eukaryotic cells Karyogamy in the context of cell fusion. 1-haploid cells, 2-cell fusion, 3-single cell with two pronuclei, 4-fusing pronuclei (karyogamy), 5-diploid cell Karyogamy is the final step in the process of fusing together two haploid eukaryotic cells, and refers specifically to the fusion of the two nuclei. Before karyogamy, each haploid cell has one complete copy of the organism's genome. In order for karyogamy to occur, the cell membrane and cytop…

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (أبريل 2019) برايان ليونغ سيو فاي معلومات شخصية الميلاد 7 أبريل 1964 (59 سنة)  مواطنة الصين  الحياة العملية المهنة دي جيه،  ومقدم تلفزيوني  تعديل مصدري - تعديل   برا

1934 film by Henry Hathaway The Last Round-UpTheatrical release posterDirected byHenry HathawayScreenplay byRandolph ScottBased onThe Border Legionby Zane GreyProduced byHarold HurleyStarring Randolph Scott Monte Blue Barbara Fritchie CinematographyArchie StoutMusic byHerman HandProductioncompanyParamount PicturesDistributed byParamount PicturesRelease date May 1, 1934 (1934-05-01) (USA) Running time61 minutesCountryUnited StatesLanguageEnglish The Last Round-Up is a 1934 Amer…

Season of television series NieR:Automata Ver1.1aLogo of the anime seriesCountry of originJapanNo. of episodes12ReleaseOriginal networkTokyo MX, GYT, GTV, BS11Original releaseJanuary 8, 2023 (2023-01-08) –present (present) Nier: Automata Ver1.1a is a Japanese anime television series based on the 2017 action role-playing game Nier: Automata. The plot follows androids of the YoRHa military force fighting for humanity in a proxy war with alien-created Machine Lifeforms.[1]&…

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (يونيو 2013) موزايكا للتعليممعلومات عامةالتأسيس 1997 النوع عمل تجاري المقر الرئيسي أتلانتا موقع الويب mosaicaeducation.com تعديل - تعديل مصدري - تعديل ويكي بيانات شركة موزايكا للتعلي…

Slovene poet This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Simon Gregorčič – news · newspapers · books · scholar · JSTOR (August 2014) (Learn how and when to remove this template message) Simon GregorčičBorn(1844-10-15)October 15, 1844Vrsno, Austrian Littoral, Austrian EmpireDiedNovember 24, 1906(1906-11-…

Planned township in Greater Jakarta, Indonesia Planned townshipAlam SuteraPlanned townshipAlam Sutera CBD viewed from Kunciran–Serpong Toll RoadCoordinates: 6°18′02″S 106°39′2″E / 6.30056°S 106.65056°E / -6.30056; 106.65056LocationBanten, IndonesiaManaging entityPT Alam Sutera Realty TbkEstablished1994Area • Total800 ha (2,000 acres)Websitewww.alam-sutera.com Alam Sutera is a mixed township at South Tangerang City and Tangerang City of …

Railway station in Maizuru, Kyoto Prefecture, Japan Shinonome Station東雲駅Shinonome Station, February 2020General informationLocationMizuma, Maizuru-shi, Kyoto-fu 624-0965JapanCoordinates35°28′30″N 135°17′06″E / 35.47500°N 135.28500°E / 35.47500; 135.28500Operated by Kyoto Tango RailwayLine(s)■ Miyazu Line Distance8.9 km from Nishi-MaizuruPlatforms2 side platformsConnections Bus stop Other informationStatusUnstaffedStation codeM10WebsiteOfficial websiteH…

У Вікіпедії є статті про інших людей із прізвищем Козолій. Олександр Володимирович Козолій  Старший лейтенант Загальна інформаціяНародження 29 травня 1984(1984-05-29)Приморський край, РРФСР, СРСРСмерть 2014Луганськ, Україна(загинув у збитому терористами літаку)Національність …

French cyclist Edwige PitelPitel in 2017Personal informationFull nameEdwige PitelBorn (1967-06-04) 4 June 1967 (age 56)Dinan, FranceTeam informationDisciplineRoadRoleRiderProfessional teams2005Univega Pro Cycling Team2006Bianchi Alverti Kookai2007Team Uniqa Graz2008Pro Feminin Les Carroz2010SC Michela Fanini Record Rox2011Vienne Futuroscope2013–2016S.C. Michela Fanini Rox2018–2020Cogeas–Mettler Pro Cycling Team[1] Major winsStage races Tour de Bretagne (2003) Tour Fémini…

1949 novel by P. G. Wodehouse The Mating Season First edition (UK)AuthorP. G. WodehouseCountryUnited KingdomLanguageEnglishSeriesJeevesGenreComic novelPublisherHerbert Jenkins (UK)Didier & Co. (US)Publication date9 September 1949 (UK)29 November 1949 (US)Media typePrintPreceded byJoy in the Morning Followed byRing for Jeeves  The Mating Season is a novel by P. G. Wodehouse, first published in the United Kingdom on 9 September 1949 by Herbert Jenkins, London, and in t…

Football tournament season 2022 Norwegian Football CupTournament detailsCountry NorwayDates4 May 2022 – 20 May 2023Teams128 (competition proper)Defending championsMoldeFinal positionsChampionsBrann (7th title)Runner-upLillestrømTournament statisticsMatches played127Goals scored559 (4.4 per match)Scoring leader(s)Bård Finne(11 goals)← 20212023 → Ullevaal Stadion, Oslo - venue for the Norwegian Cup final The 2022 Norwegian Football Cup was the 116…

NASCAR auto racing organization This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Melling Racing – news · newspapers · books · scholar · JSTOR (October 2013) (Learn how and when to remove this template message) Melling RacingOwner(s)Harry Melling (1982–1999) Mark Melling (1999–2002)BaseMooresville, North Caro…

Kembali kehalaman sebelumnya