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-statement
optC++17condition
)
statement
init-statement
:
expression-statement
simple-declaration
condition
:
expression
attribute-specifier-seq
optdecl-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 condition
neden 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 case
default
etiketi yalnızca bir switch
deyimin içinde görünebilir.
constant-expression
Her case
etiketteki değeri ile aynı türde condition
sabit 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 case
constant-expression
sonraki ilk deyime condition
geç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 switch
sonuna kadar olan ve dahil olmak üzere default
tüm deyimler yürütülür. Örneğin:
// 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üşüksec
case'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. Örneğin:
// 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.