Switch CASE



  • Hallo,

    gibt es einen vernünftigen Grund wieso switch case nicht für strings funktioniert ? Ich würde behaupten irgendwann wird es funktionieren. Momentan schluckts der Compiler halt nicht.



  • Switch ist nicht nur dazu da, um komplexe if-else-Konstruktionen zu vermeiden, sondern auch um die Ausführung zu beschleunigen.

    Der Compiler kann z. B. die Werte, auf die geprüft wird, benutzen, um Sprungbefehle zu berechnen oder um die Sprünge in einer Look-Up-Tabelle nachsehen zu lassen usw. Deswegen müssen die Werte bei den Case-Marken zur Compile-Zeit bekannt sein.

    Auf String-Literale wird über eine Adresse zugegriffen, an der die Strings geladen wurden. Da diese Adresse erst zur Laufzeit bekannt ist, kann ein String-Literal nicht im Switch-Konstrukt verwendet werden.

    Möglicherweise gibt es noch weitere Gründe oder detailliertere Erklärungen.



  • GyroGearloose schrieb:

    Switch ist nicht nur dazu da, um komplexe if-else-Konstruktionen zu vermeiden, sondern auch um die Ausführung zu beschleunigen.

    Der Compiler kann z. B. die Werte, auf die geprüft wird, benutzen, um Sprungbefehle zu berechnen oder um die Sprünge in einer Look-Up-Tabelle nachsehen zu lassen usw. Deswegen müssen die Werte bei den Case-Marken zur Compile-Zeit bekannt sein.

    Auf String-Literale wird über eine Adresse zugegriffen, an der die Strings geladen wurden. Da diese Adresse erst zur Laufzeit bekannt ist, kann ein String-Literal nicht im Switch-Konstrukt verwendet werden.

    Möglicherweise gibt es noch weitere Gründe oder detailliertere Erklärungen.

    IN C# und Java funktioniert gibt es das ja. (C#)

    GyroGearloose schrieb:

    Auf String-Literale wird über eine Adresse zugegriffen, an der die Strings geladen wurden. Da diese Adresse erst zur Laufzeit bekannt ist, kann ein String-Literal nicht im Switch-Konstrukt verwendet werden.

    Theoretisch ist es über Hashes möglich, indem der Compiler von den Case Strings je einen eindeutigen Hash bestimmt und den als Case-Wert verwendet und innerhalb des Case muss dann nur nochmal mit dem ursprünglichen String verglichen werden und fertig.


Anmelden zum Antworten