2015-10-15 13 views
5

Próbuję przekonwertować to do instrukcji switchinstrukcja switch wielo charakter stały

if (codeSection == 281) 
    cout << "bigamy"; 
else if (codeSection == 321 || codeSection == 322) 
    cout << "selling illegal lottery tickets"; 
else if (codeSection == 383) 
    cout << "selling rancid butter"; 
else if (codeSection == 598) 
    cout << "wounding a bird in a public cemetery"; 
else 
    cout << "some other crime"; 

// Actual switch statement 
switch (codeSection) 
{ 
    case '281': 
     cout << "bigamy" << endl; 
     break; 

    case '321': 
    case '322': 
     cout << "selling illegal lottery tickets" << endl; 
     break; 

    case '383': 
     cout << "selling rancid butter" << endl; 
     break; 

    case '598': 
     cout << "wounding a bird in a public cemetery"; 
     break; 

    default: 
     cout << "some other crime"<< endl; 

} 

Kompilator mówi instrukcja switch wielo charakter stały i daje mi żółtą ostrzeżenie, ale nadal kompiluje. Moje pytanie brzmi: czy przypadek ma być tylko w formie char? jak przypadku „2”

+0

Powinieneś prawdopodobnie wiedzieć, że ostrzeżenie ** dotyczące kompilatora ** jest czymś, co powinieneś wziąć pod uwagę, ale niekoniecznie musi coś złamać. Wiele ostrzeżeń może zostać wyłączonych (a nie koniecznie powinno). ** Błędy **, z drugiej strony, uniemożliwiają poprawne skompilowanie lub poprawne działanie kodu. – CodeMouse92

Odpowiedz

5
case '281': 

powinny być

case 281: 

i podobnie do reszty, inaczej kompilator „myśli”, że próby korzystania wieloznakowy stała, która nie jest to, czego prawdopodobnie chcieć.

A case nie musi być char. W rzeczywistości musi to być stała ekspresja tego samego rodzaju, co typ warunku po konwersji i całkowych promocjach, patrz np. http://en.cppreference.com/w/cpp/language/switch.

+0

... Powodem jest, że dołączanie czegoś do pojedynczych cudzysłowów określa go jako literał literowy, a pozostawienie ich w tym przypadku czyni literał całkowity. – CodeMouse92

+0

@ JasonMc92 Prawdziwe, wielobajtowe stałe wielobajtowe są jakoś zniechęcone, ponieważ ich wartość jest definiowana przez implementację. – vsoftco

+0

Tak, masz rację. Znalazłem [ten artykuł] (http://www.zipcon.net/~swhite/docs/computers/languages/c_multi-char_const.html) na temat. – CodeMouse92