Probleme mit Typerkennung



  • Ey, mein Thread wurde einfach in die FAQ verschoben und ich war noch gar nicht fertig 😃 😃 . Also Du kannst wenn Du es willst, dass hier noch dranhängen (wenn es denn was taugt). Hier gehts zur Vorgeschichte:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-247178.html

    Und so gehts weiter.... 😃

    Da bin ich nun schon einen ganzen Schritt weiter. Doch habe ich noch einige Fragen. Wenn ich an eine Variable f oder L anhänge, dann wird dadurch auch der Typ bestimmt, also float und long? Das bedeutet, dass das hier eine gültige deklaration ist:

    2L; //oder:
    long A=2; //ist das das gleiche?
    

    Dann frage ich mich aber, warum das hier keine Probleme macht:

    int A=2L;
    

    Ich weise eine integer Variable einen long Wert zu. Greift hier das automatische Casting oder warum gibts keine Fehlermeldung?

    Wäre das hier nicht doppeltgemoppelt:

    long B=2L //zweimal als long deklariert?
    

    Vielen Dank für eure Hilfe
    lg, freakC++



  • freakC++ schrieb:

    long A=2L; //oder:
    long A=2; //ist das das gleiche?
    

    Da wird vermutlich implizit gecastet. Aber letztlich läuft es für dich doch auf das gleiche Resultat hinaus, oder?

    freakC++ schrieb:

    Wäre das hier nicht doppeltgemoppelt:

    long B=2L //zweimal als long deklariert?
    

    Na ja, eigentlich nicht. Du legst den Typ für B bei der Deklaration fest, und du bestimmst den Typ für die Konstante 2. Ob die jetzt zugewiesen wird, ist ja erstmal egal.


  • Mod

    2L;
    

    Eine Deklaration ist etwas, dass einen Bezeichner einführt (oder in bestimmten Definition ein unbenanntes Objekt definiert).
    Das ist hier nicht der Fall, wir haben es mit einem "expression statement" zu tun (vernünftige Übersetzung gesucht, "Ausdrucksstatement" gefällt nicht).

    2L
    

    setllt ein Literal dar, also ein Ausdruck, der ein Konstante eines bestimmten Typs bezeichnet, diesem Fall eben die Konstante 2 des Typs long, dank des Suffix L.

    long A=2;
    

    Das ist eine Deklaration, in der der Bezeichner A eingeführt wird. Es ist zudem eine Definition, in der für die Variable Speicher reserviert wird. Zudem wird diese Variable gleichzeitig initialisiert. Der initialisierende Ausdruck hat den Wert 2 des Typs int (da 2 ein Literal des Typs int ist). int wird implizit in long konvertiert.

    int A=2L;
    

    analog. Ein int-Variable wird definiert und initialisiert. Der Ausdruck des Typs long wind implizit in int konvertiert. Da 2 in den Wertebereich von int fällt, ist das wohlgeformt.

    Konvertierungen zwischen verschiedenen integralen Typen sind stets implizit möglich.

    Ich habe mich vor ein paar Tagen zum Unterschied zwischen Cast und Konvertierung geäußert, kann den Beitrag aber gerade nicht finden.



  • EDIT: Mal wieder zu langsam und natürlich nur bedingt "camper-konform" 😉
    Naja - ich lasse es mal stehen.

    Ich vermute, Du verwechselst da was:

    freakC++ schrieb:

    ...Wenn ich an eine Variable f oder L anhänge...

    Nein!
    Es müsste heißen "Wenn ich an einen Literal ..."
    Dementsprechend:

    freakC++ schrieb:

    2L; //oder:
    long A=2; //ist das das gleiche?
    

    Nein, ist nicht das gleiche.
    Ersteres ist keine Deklaration, Zweiteres schon.
    Dabei taucht auch ein Literal auf ("2") - genauergesagt ein Integerliteral -, den der Compiler klaglos als Initialisierer für die long-Variable A akzeptiert.

    freakC++ schrieb:

    int A=2L;
    

    Ich weise eine integer Variable einen long Wert zu. Greift hier das automatische Casting oder warum gibts keine Fehlermeldung?

    Ich vermute, dass der Compiler den Literal auswertet und von sich aus erkennt, dass er "verlustlos" in ein int passt. Ist aber IMHO kein vom Standard definiertes Verhalten.

    freakC++ schrieb:

    Wäre das hier nicht doppeltgemoppelt:

    long B=2L;
    

    Nein - das wäre genau das Richtige. (oftmals ist man aber zu faul)

    Gruß,

    Simon2.



  • Ich möchte noch hinzufügen, dass ohne Suffix der Typ eines Ganzzahl-Literals noch nicht eindeutig festgelegt ist. Der Typ hängt auch vom Zahlenwert und den Wertebereichen der Typen ab. So kann das Literal 0x9000 auf einem System ein int sein und auf einem anderen ein unsigned int sein, weil int eventuell nur Zahlen bis 0x7FFF darstellen kann.

    Eine nette Übersicht liefert der Standard. Ich habe davon keine Kopie, aber diese Version tut es auch. Siehe Kapitel 2.13 (Seiten 18-23).

    Man beachte, dass das verlinkte PDF ein sehr früher Entwurf von C++0x ist, welches die Typen long long und unsigned long long enthält. Diese gibt es aber offiziell nicht bei C++98 oder C++03.

    Gruß,
    SP


Anmelden zum Antworten