switch me off!
-
@Lou-Cyphr3 Deine Unterlagen zum lernen bringen dich nicht weiter. Darum vergiss diese, nimm andere.
switch
wertet den Ausdruck in den () - als integer - aus und springt zum entsprechendencase
.
Meist steht in den () nur eine Variable, nie jedoch ein logischer Ausdruck (dafür nimmt manif
)
-
switch/case ist im Prinzip eine andere Schreibweise für:
if (a == x) // case x mach dies; else if (a == y) // case y mach jenes; else if (a == z) // case z mach anderes; ... ... else /* default, alle anderen Fälle */ mach was wenn nichts zutrifft;
-
@RBS2 Ich möchte noch anmerken, dass das genau dann gilt, wenn jedes case mit einem break; Statement terminiert wird (was man i. d. R. auch so macht).
-
Und soweit ich weiß funktionieren bei den cases auch nur Zahlen bzw. was als Zahlen interpretiert werden kann. Besser gesagt integralen Zahlen. else if ermöglicht zum Beispiel den Vergleich von zwei Strings, was bei switch case nicht funktioniert. Schreibt, wenn ich falsch liege
-
@Zhavok ja, enum/enum class geht auch.
Wenn man unbedingt strings switchen will:
constexpr std::uint32_t fnv32(std::string_view s) { std::uint32_t hash{2166136261u}; for (std::size_t i = 0; i < s.size(); ++i) { hash = 16777619u * (hash ^ s[i]); } return hash; } std::string s = "foo"; switch (fnv32(s)) { case fnv32("foo"): // ... break; case fnv32("bar"): // ... break; // .... }
-
Hahaha. Das ist das beste Beispiel Strings zu vergleichen um andere Entwickler zu ärgern, die das dann lesen müssen. Aber trotzdem interessant die Methode, den String einfach zu hashen
-
Warum? Ist doch sogar ganz gut lesbar.
-
Ja schon, aber ich denke in der Praxis werden die meisten andere Wege nutzen um Strings zu vergleichen. Über ein == oder .compare() liest man einfach schneller drüber. Aber wenn man unbedingt switch/case nutzen will, sicher ein guter Weg
-
@Zhavok sagte in switch me off!:
Ja schon, aber ich denke in der Praxis werden die meisten andere Wege nutzen um Strings zu vergleichen. Über ein ==
== bei Strings vergleicht ihre Adressen. Das geht schief wenn man mit Gleichheit gleichen Inhalt meint. Da muss schon ein strcmp() oder sowas her.
-
Danke für die Tipps und die netten Worte.
#include <iostream> using namespace std; int main() { unsigned short a,b; cout << "Erste Ziffer (1..3): "; cin >> a; cout << "Zweite Ziffer (1..3): "; cin >> b; switch (a) { case 1 : switch (b){ case 1 : cout << "Elf" << endl; break; case 2 : cout << "zwölf" << endl; break; case 3 : cout << "Dreizehn" << endl; break; default : cout << "falsche Eingabe." << endl; } } return 0; }
So sollte es zufrieden stimmen.
-
@Lou-Cyphr3 sagte in switch me off!:
So sollte es zufrieden stimmen.
Für den Fall a==1. Das ist schon mal ein Anfang.
-
@Lou-Cyphr3 das werden dann 12
case
bei 4switch
.
wie wäre es mit 1switch
und 9case
?
-
@DirkB sagte in switch me off!:
@Lou-Cyphr3 das werden dann 12
case
bei 4switch
.
wie wäre es mit 1switch
und 9case
?11,12,13,
21,22,23
31,32,33also 3 * 3 cases,
bei einem switch: 9+default = 10.
bei 4 switch: 9+4*default = 13.
-
@RBS2 sagte in switch me off!:
== bei Strings vergleicht ihre Adressen.
Quatsch, sofern hier gerade von std::strings die Rede ist.
-
@RBS2 sagte in switch me off!:
bei 4 switch: 9+4*default = 13.
Nö. 12 + 4*default = 16;
switch(a) hat 3 case und ein default.
Jeder case von a hat ein switch(b) mit ebenso 3 case und ein default.
-
@DirkB sagte in switch me off!:
@RBS2 sagte in switch me off!:
bei 4 switch: 9+4*default = 13.
Nö. 12 + 4*default = 16;
switch(a) hat 3 case und ein default.
Jeder case von a hat ein switch(b) mit ebenso 3 case und ein default.Hast recht.
switch (a) case 1: switch (b) case 1: case 2: case 3: default: case 2: switch (b) case 1: case 2: case 3: default: case 3: switch (b) case 1: case 2: case 3: default: default: // von switch(a)
-
Hallo,
ich hab jetzt ein default-Problem.
#include <iostream> using namespace std; int main() { unsigned short a,b; cout << "Erste Ziffer (1..3): "; cin >> a; cout << "Zweite Ziffer (1..3): "; cin >> b; switch (a) { case 1 : switch (b){ case 1 : cout << "Elf" << endl; break; case 2 : cout << "zwölf" << endl; break; case 3 : cout << "Dreizehn" << endl; break; default : "falsch 1 \n"; } case 2 : switch (b){ case 1 : cout << "Einundzwanzig" << endl; break; case 2 : cout << "Zweiundzwanzig" << endl; break; case 3 : cout << "Dreiundzwanzig" << endl; break; default : cout << " falsch 2 \n"; } case 3 : switch (b){ case 1 : cout << "Einunddreissig" << endl; break; case 2 : cout << "Zweiunddreissig" << endl; break; case 3 : cout << "Dreiunddreissig" << endl; break; default : cout<< " falsch 3 \n"; } default : cout << "a falsch \n"; } return 0; }
Aus welchem Grund gibt es mir immer zusätzlich eine Falsche Eingabe
für a zurück?
-
Dann hast du offensichtlich irgendwo ein break vergessen.
-
So ist es . Danke @spiri
Waren gleich 3
-
@Lou-Cyphr3 Du solltest deinem Compiler sagen, dass er dich davor warnt!
Wenn ich den Code aus deinem Post mit
g++ -Wall -Wextra missingbreak.cpp
kompiliere, bekomme ich:g++ missingbreak.cpp -Wall -Wextra missingbreak.cpp: In function ‘int main()’: missingbreak.cpp:25:38: warning: statement has no effect [-Wunused-value] default : "falsch 1 \n"; ^ missingbreak.cpp:43:33: warning: this statement may fall through [-Wimplicit-fallthrough=] default : cout << " falsch 2 \n"; ~~~~~^~~~~~~~~~~~~~~~~ missingbreak.cpp:46:8: note: here case 3 : ^~~~ missingbreak.cpp:59:32: warning: this statement may fall through [-Wimplicit-fallthrough=] default : cout<< " falsch 3 \n"; ~~~~^~~~~~~~~~~~~~~~~ missingbreak.cpp:62:11: note: here default : cout << "a falsch \n"; ^~~~~~~
Und clang sagt:
clang++-7 missingbreak.cpp -Weverything -std=c++17 missingbreak.cpp:25:25: warning: expression result unused [-Wunused-value] default : "falsch 1 \n"; ^~~~~~~~~~~~~ missingbreak.cpp:28:6: warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough] case 2 : ^ missingbreak.cpp:28:6: note: insert '[[fallthrough]];' to silence this warning case 2 : ^ [[fallthrough]]; missingbreak.cpp:28:6: note: insert 'break;' to avoid fall-through case 2 : ^ break; missingbreak.cpp:46:8: warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough] case 3 : ^ missingbreak.cpp:46:8: note: insert '[[fallthrough]];' to silence this warning case 3 : ^ [[fallthrough]]; missingbreak.cpp:46:8: note: insert 'break;' to avoid fall-through case 3 : ^ break; missingbreak.cpp:62:11: warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough] default : cout << "a falsch \n"; ^ missingbreak.cpp:62:11: note: insert '[[fallthrough]];' to silence this warning default : cout << "a falsch \n"; ^ [[fallthrough]]; missingbreak.cpp:62:11: note: insert 'break;' to avoid fall-through default : cout << "a falsch \n"; ^ break; 4 warnings generated.
Du siehst noch eine andere Warnung in beiden Ausgaben (unused-value), das ist auch noch ein Fehler in deinem Code.