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:

Erin KellymanLahir17 Oktober 1998 (umur 25)Tamworth, Staffordshire, Britania RayaKebangsaan Britania RayaPekerjaanAktris Erin Mae Kellyman (lahir 17 Oktober 1998) adalah seorang aktris Inggris. Kellyman muncul sebagai Enfys Nest, pemimpin pemberontak Cloud Riders, di Solo: A Star Wars Story[1][2] dan Eponine Thénardier dalam adaptasi BBC tahun 2019 dari novel Victor Hugo, Les Miserables. Referensi ^ Latest World & National News & Headlines. USATODAY.com. Dia...

 

Berber tribe in northern Algeria This article is about Kutama, a Berber tribe. For the boarding school in Zimbabwe, see Kutama College. For the town in Zimbabwe, see Kutama, Zimbabwe. The Kutama (Berber: Ikutamen; Arabic: كتامة) was a Berber tribe in northern Algeria classified among the Berber confederation of the Bavares. The Kutama are attested much earlier, in the form Koidamousii by the Greek geographer Ptolemy.[1] The Kutama played a pivotal role in establishing the Fatimid...

 

1960 film Brandenburg DivisionDirected byHarald PhilippWritten byHarald PhilippProduced byWilly ZeynStarringHanns Ernst JägerWolfgang ReichmannHeinz WeissCinematographyHeinz HölscherEdited byElisabeth Kleinert-NeumannMusic byHans-Martin MajewskiProductioncompanyWilly Zeyn-FilmDistributed bySchorcht FilmverleihRelease date15 September 1960Running time104 minutesCountryWest GermanyLanguageGerman Brandenburg Division (German: Division Brandenburg) is a 1960 West German war film directed by Har...

Pour les articles homonymes, voir Jarre et JMJ (homonymie). Ne doit pas être confondu avec Jean-Michel Jacques. Jean-Michel Jarre Jean-Michel Jarre en 2016.Informations générales Nom de naissance Jean-Michel André Jarre Naissance 24 août 1948 (75 ans)Lyon (France) Activité principale Auteur-compositeur Activités annexes Producteur de musique Genre musical Musique électronique, musique progressive, new age, space music, chill-out, ambient, trance, rock progressif Instruments Synth...

 

Se ha sugerido que esta página sea renombrada como «Pecorino romano». Motivo: los argumentos están expuestos en la página de discusión. Pecorino romano Tipo PecorinoPaís de origen ItaliaLeche de OvejaPasteurizado Depende de la variedadAñejamiento 6 mesesDenominación de origen DOP en 1996[editar datos en Wikidata] Pecorino romano es un queso de leche de oveja (la palabra pecora, de la que deriva, significa «oveja» en italiano) de aspecto duro, y sabor salado empleado frecu...

 

Este artigo não cita fontes confiáveis. Ajude a inserir referências. Conteúdo não verificável pode ser removido.—Encontre fontes: ABW  • CAPES  • Google (N • L • A) (Julho de 2020) Coordenadas: 52° 18' N 5° 37' E Localização de Ermelo nos Países Baixos Sede do município de Ermelo Ermelo é uma cidade e sede município da província da Guéldria, nos Países Baixos. Nos seus 87,40 km² vivem 26 590 habitan...

Lodewijk van Blois knielt voor Christus en Maria. Titelpagina voor: L. Blosius, Opera, Antwerpen: 1632. Lodewijk van Blois (Frans : Louis de Blois), (Donstiennes, oktober 1506 – Liessies, 7 januari 1566), was een Zuid-Nederlands mysticus. Hij publiceerde zijn werken onder de naam Ludovicus Blosius. Hij werd geboren op het kasteel van Donstiennes, dat toen bij het prinsbisdom Luik hoorde. Hij kreeg zijn opvoeding aan het Nederlandse hof, in Gent, vaak samen met de latere keizer Karel V,...

 

Yowis Ben 2Poster filmSutradara Fajar Nugros Bayu Skak Produser Chand Parwez Servia Fiaz Servia Ditulis oleh Bagus Bramanti SkenarioBagus BramantiCeritaBayu SkakPemeran Bayu Skak Joshua Suherman Brandon Salim Tutus Thomson Anya Geraldine Anggika Bölsterli Devina Aureel Laura Theux Arief Didu Budi Dalton Siti Badriah Penata musikAndhika TriyadiSinematograferGoenrockPenyuntingWawan I. WibowoPerusahaanproduksiStarvision PlusTanggal rilis 14 Maret 2019 (2019-03-14) Durasi109 menitNega...

 

Поволзький економічний район на мапі Росії Пово́лзький економічний район — один з 11 економічних районів Росії, складається з 8 федеральних суб'єктів:  Республіка Татарстан Астраханська область Волгоградська область Пензенська область Самарська область Саратовськ

Вікіпедія мовою конкані Створена 2015[1] Кількість статей 3591 Кількість редагувань 212 200 Кількість користувачів 10 037 Кількість адміністраторів 4 Загальна кількість сторінок 9443 Кількість файлів 0 Глибина 59.7 Головна сторінка मुखेल पान Дані за: 5 грудня 2023 року Вік...

 

Artikel ini perlu diwikifikasi agar memenuhi standar kualitas Wikipedia. Anda dapat memberikan bantuan berupa penambahan pranala dalam, atau dengan merapikan tata letak dari artikel ini. Untuk keterangan lebih lanjut, klik [tampil] di bagian kanan. Mengganti markah HTML dengan markah wiki bila dimungkinkan. Tambahkan pranala wiki. Bila dirasa perlu, buatlah pautan ke artikel wiki lainnya dengan cara menambahkan [[ dan ]] pada kata yang bersangkutan (lihat WP:LINK untuk keterangan lebih lanjut...

 

Area in Northern California, U.S. This article is about the portion of the Santa Clara Valley. For the reservation in Mendocino County, see Coyote Valley Reservation. For valley in Colorado sometimes known as Coyote Valley, see Kawuneeche Valley. Coyote ValleyA view across the Coyote Valley towards Morgan Hill from Santa Teresa County Park, April 1, 2006Floor elevation260 feet (79 m) at Coyote, California[1]Length7 miles Northwest to SoutheastWidth2 milesGeographyLocationCali...

Not to be confused with Cleethorpes Town F.C. (1884). Association football club in England Football clubCleethorpes TownFull nameCleethorpes Town Football ClubNickname(s)The OwlsFounded1998GroundLinden Club, GrimsbyCapacity1,000 (180 seated)[1]ChairmanJason LeddenManagerTim Lowe & Liam DickensLeagueNorthern Premier League Division One East2022–23Northern Premier League Division One East, 11th of 20 Home colours Away colours Cleethorpes Town Football Club is a football club based...

 

Romance subfamily of Southeast Europe See also: Proto-Romance and Common Romanian Eastern RomanceGeographicdistributionThe Balkans, in Eastern EuropeLinguistic classificationIndo-EuropeanItalicLatino-FaliscanLatinRomanceEastern RomanceEarly formsOld Latin Vulgar Latin Proto-Romance Common Romanian Subdivisions Aromanian Daco-Romanian (Romanian) Istro-Romanian Megleno-Romanian Glottologeast2714  (Eastern Romance)Regions inhabited nowadays by Eastern Romance-speakers The Eastern Romance la...

 

For other people named Catherine Fox, see Catherine Fox (disambiguation). American swimmer Catherine FoxPersonal informationFull nameCatherine Mai-Lan FoxNational team United StatesBorn (1977-12-15) December 15, 1977 (age 45)Roeland Park, KansasHeight5 ft 4 in (1.63 m)Weight119 lb (54 kg)SportSportSwimmingStrokesBackstroke, freestyleClubKansas City BlazersCollege teamStanford University Medal record Women's swimming Representing the United States O...

American college football season 1950 Florida Gators footballThe 1950 Gators practice under the lights before the first night game at Florida Field.ConferenceSoutheastern ConferenceRecord5–5 (2–4 SEC)Head coachBob Woodruff (1st season)CaptainAngus WilliamsHome stadiumFlorida Field(capacity: 39,453)Seasons← 19491951 → 1950 Southeastern Conference football standings vte Conf Overall Team W   L   T W   L   T No. 7 Kentucky $ 5 – 1 ...

 

Perangkat audio, salah satu contoh elektronik konsumen. An Iraqi National Police officer use DC angd DV Elektronik konsumen (bahasa Inggris: consumer electronics, disingkat CE) adalah alat elektronik yang ditujukan untuk penggunaan sehari-hari dan dapat digunakan untuk hiburan, komunikasi, serta bisnis. Penyiaran radio pada awal abad ke-20 menciptakan produk konsumen terbesar pada saat itu, yaitu penerima siaran radio. Produk selanjutnya yang termasuk dalam elektronik konsumen adalah komp...

 

2014 video game 2014 video gameAssassin's Creed UnityDeveloper(s)Ubisoft Montreal[a]Publisher(s)UbisoftDirector(s)Alexandre AmancioMarc AlbinetProducer(s)Vincent PontbriandAntoine Vimal du MonteilPhilippe DucharmeDesigner(s)Alexandre PedneaultProgrammer(s)James TherienArtist(s)Mohamed GambouzWriter(s)Sylvain BernardAlexandre AmancioTravis StoutRussell LeesDarby McDevittCeri YoungComposer(s)Chris TiltonSarah SchachnerRyan AmonSeriesAssassin's CreedEngineAnvilNext 2.0Platform(s)PlayStat...

第5艦隊創設1943年-1945年1995年-国籍 アメリカ合衆国上級部隊海軍作戦本部アメリカ中央軍渾名5F表話編歴 第5艦隊(だい5かんたい、U.S. Fifth Fleet)は、アメリカ海軍の艦隊。ペルシア湾、紅海、アラビア海から、ケニアまでの東アフリカを責任地域とし、バーレーンに司令部を置く。人員・機材は太平洋艦隊および大西洋艦隊から提供される為、専任艦船は保持していない...

 

Лондонский метрополитенангл. London Underground Описание Тип метрополитен Страна  Великобритания Расположение Лондон Дата открытия 10 января 1863 года Владелец Transport for London Эксплуатант London Underground Limited Дневной пассажиропоток 3,79 млн чел.[1] Годовой пассажиропоток 1384 млн чел. ...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!