2015-10-15 6 views
5

Ich versuche, dies in einer switch-Anweisungswitch-Anweisung mit mehreren Zeichenkonstante

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; 

} 

Der Compiler sagt Anweisung Schalter Multi Zeichenkonstante zu konvertieren, und gibt mir eine gelbe Warnung aber kompiliert noch. Meine Frage ist, soll der Fall nur in Char Form sein? wie Fall ‚2‘

+0

Sie sollten wahrscheinlich wissen, dass ein Compiler ** Warnung ** etwas ist, das Sie unter Beratung nehmen sollten, aber nicht unbedingt etwas kaputt machen wird. Viele Warnungen können tatsächlich deaktiviert werden (nicht das sie unbedingt sollten). ** Fehler ** andererseits verhindern, dass Ihr Code korrekt kompiliert oder ausgeführt wird. – CodeMouse92

Antwort

5
case '281': 

sollte, für den Rest

case 281: 

und ähnlich sein sonst der Compiler „denkt“, dass Sie versuchen, eine Multi-Zeichen-Konstante zu verwenden, das nicht das, was Sie wahrscheinlich wollen.

Ein case muss kein char sein. In der Tat muss es ein konstanter Ausdruck des gleichen Typs wie der Typ der Bedingung nach Konvertierungen und integralen Promotionen sein, siehe z.B. http://en.cppreference.com/w/cpp/language/switch.

+0

... Der Grund dafür ist, dass etwas in einfache Anführungszeichen eingeschlossen wird, es als Zeichenliteral angibt, während es in diesem Fall ein Integer-Literal bleibt. – CodeMouse92

+0

@ JasonMc92 Wahr, afaik Multi-Zeichen-Konstanten werden irgendwie abgeraten, da ihr Wert implementation-defined ist. – vsoftco

+0

Ja, du hast Recht. Ich habe [diesen Artikel] (http://www.zipcon.net/~swhite/docs/computers/languages/c_multi-char_const.html) zu dem Thema gefunden. – CodeMouse92