Aracılığıyla paylaş


switch deyimi (C++)

Bir integral ifadesinin değerine bağlı olarak kodun birden çok bölümü arasında seçime izin verir.

Sözdizimi

selection-statement:
switch(init-statementoptC++17condition)statement

init-statement:
expression-statement
simple-declaration

condition:
expression
attribute-specifier-seqopt decl-specifier-seq declarator brace-or-equal-initializer

labeled-statement:
case constant-expression : statement
default : statement

Açıklamalar

Deyimi switch , değerine bağlı olarak denetimin deyimi gövdesinde birine labeled-statement aktarılmasına conditionneden olur.

tam condition sayı türüne sahip olmalıdır veya tam sayı türüne kesin olmayan bir dönüştürmesi olan bir sınıf türü olmalıdır. İntegral yükseltme, Standart dönüştürmelerde açıklandığı gibi gerçekleşir.

Deyim switch gövdesi bir dizi case etiket ve bir optbölgesel default etiket içerir. A labeled-statement , bu etiketlerden ve ardından gelen deyimlerden biridir. Etiketli deyimler söz dizimsel gereksinimler değildir, ancak switch bunlar olmadan ifade anlamsızdır. Deyimlerdeki case iki constant-expression değer aynı değeri değerlendiremeyebilir. Etiket default yalnızca bir kez görünebilir. Deyimi default genellikle sonuna yerleştirilir, ancak deyim gövdesinde switch herhangi bir yerde görünebilir. Veya casedefault etiketi yalnızca bir switch deyimin içinde görünebilir.

constant-expression Her case etiketteki değeri ile aynı türde conditionsabit bir değere dönüştürülür. O zaman eşitlik için ile condition karşılaştırıImış olur. Denetim, değeriyle eşleşen değerden caseconstant-expression sonraki ilk deyime conditiongeçer. Elde edilen davranış aşağıdaki tabloda gösterilmiştir.

switch deyim davranışı

Koşul Eylem
Dönüştürülen değer, yükseltilen denetim ifadesinin değeriyle eşleşir. Denetim, bu etiketin ardından deyimine aktarılır.
Sabitlerin hiçbiri etiketlerdeki case sabitlerle eşleşmiyor; bir default etiket var. Denetim etikete default aktarılır.
Sabitlerin hiçbiri etiketlerdeki case sabitlerle eşleşmiyor; etiket yok default . Denetim deyiminden sonra deyimine switch aktarılır.

Eşleşen bir ifade bulunursa yürütme daha sonra case veya default etiketlerle devam edebilir. deyimi break , yürütmeyi durdurmak ve deyiminden sonra denetimi deyimine switch aktarmak için kullanılır. Deyimi break olmadan, eşleşen case etiketten öğesinin switchsonuna kadar olan ve dahil olmak üzere defaulttüm deyimler yürütülür. Örnek:

// switch_statement1.cpp
#include <stdio.h>

int main() {
   const char *buffer = "Any character stream";
   int uppercase_A, lowercase_a, other;
   char c;
   uppercase_A = lowercase_a = other = 0;

   while ( c = *buffer++ )   // Walks buffer until NULL
   {
      switch ( c )
      {
         case 'A':
            uppercase_A++;
            break;
         case 'a':
            lowercase_a++;
            break;
         default:
            other++;
      }
   }
   printf_s( "\nUppercase A: %d\nLowercase a: %d\nTotal: %d\n",
      uppercase_A, lowercase_a, (uppercase_A + lowercase_a + other) );
}

Yukarıdaki örnekte, uppercase_A bir üstcase'A' ise artırılırc. uppercase_A++ deyimi break gövdesinin switch yürütülmesini sonlandırır ve denetim döngüye while geçer. break deyimi olmadan, yürütme bir sonraki etiketli deyime "düşer", böylece lowercase_a ve other ayrıca artırılır. benzer bir amaca için case 'a'deyimi tarafından break sunulur. Daha düşükseccase'a', lowercase_a artırılır ve break deyimi deyimi gövdesini switch sonlandırır. veya c'A'default değilse'a', deyimi yürütülür.

Visual Studio 2017 ve üzeri (mod ve sonraki sürümlerde /std:c++17 kullanılabilir): [[fallthrough]] Öznitelik C++17 standardında belirtilir. Bunu bir switch deyimde kullanabilirsiniz. Bu, derleyiciye veya kodu okuyan herkese, hataya neden olan davranışın kasıtlı olduğu hakkında bir ipucudur. Microsoft C++ derleyicisi şu anda fallthrough davranışı konusunda uyarı vermediğinden bu özniteliğin derleyici davranışı üzerinde hiçbir etkisi yoktur. Örnekte özniteliği, sonlandırılmamış etiketli deyimi içindeki boş bir deyime uygulanır. Başka bir deyişle noktalı virgül gereklidir.

int main()
{
    int n = 5;
    switch (n)
    {

    case 1:
        a();
        break;
    case 2:
        b();
        d();
        [[fallthrough]]; // I meant to do this!
    case 3:
        c();
        break;
    default:
        d();
        break;
    }

    return 0;
}

Visual Studio 2017 sürüm 15.3 ve üzeri (mod ve sonraki sürümlerde /std:c++17 kullanılabilir): Deyimin switch noktalı virgülle biten bir init-statement yan tümcesi olabilir. Kapsamı deyiminin switch bloğuyla sınırlı olan bir değişkeni tanıtır ve başlatır:

    switch (Gadget gadget(args); auto s = gadget.get_status())
    {
    case status::good:
        gadget.zip();
        break;
    case status::bad:
        throw BadGadget();
    };

Bir deyiminin switch iç bloğu, ulaşılabilir oldukları sürece, yani tüm olası yürütme yolları tarafından atlanmadıkları sürece başlatıcıları olan tanımlar içerebilir. Bu bildirimler kullanılarak tanıtılan adlar yerel kapsama sahiptir. Örnek:

// switch_statement2.cpp
// C2360 expected
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    switch( tolower( *argv[1] ) )
    {
        // Error. Unreachable declaration.
        char szChEntered[] = "Character entered was: ";

    case 'a' :
        {
        // Declaration of szChEntered OK. Local scope.
        char szChEntered[] = "Character entered was: ";
        cout << szChEntered << "a\n";
        }
        break;

    case 'b' :
        // Value of szChEntered undefined.
        cout << szChEntered << "b\n";
        break;

    default:
        // Value of szChEntered undefined.
        cout << szChEntered << "neither a nor b\n";
        break;
    }
}

Bir switch deyim iç içe yerleştirilmiş olabilir. İç içe yerleştirildiğinde veya default etiketleri, case bunları kapsayan en switch yakın deyimle ilişkilendirilir.

Microsoft'a özgü davranış

Microsoft C++ deyimindeki switch değer sayısını case sınırlamaz. Sayı yalnızca kullanılabilir bellekle sınırlıdır.

Ayrıca bkz.

Seçim Deyimleri
Anahtar Sözcükler