Eine Frage zu Integer Typen Initialisierung und Suffix.



  • Hallo zusammen,

    wie groß ist der Unterschied wenn man Variablen mit einem Suffix initialisiert oder nicht? Zum Beispiel:

    const int temp1 = 0;
    const long long temp2 = 0LL;
    

    ich möchte Variablen ordnungsgemäß initialisieren. Ich hab aber auch schon öfters Konstellationen gesehen wie:

    const long long temp2 = 0;
    

    Hier weist man einem long long ein int/long zu und es wird automatisch gecastet.
    Für short gibt es ja keinen Suffix. Vielleicht übertreibe ich ein bisschen, aber ich mach deswegen solche Konstrukte😅 :

    const short temp3 = static_cast<short>(0);
    

    Ich hab mir auch schon solche Konstrukte überlegt:

    const std::size_t indexZero = static_cast<std::size_t>(0);
    

    Der Hintergrund bei dieser Konstellation ist, dass die Größe von std::size_t variieren kann. Soweit ich das gelesen habe.

    Übertreibe ich😅 ? Und nein das ist kein Scherzfrage oder Thema. Das meine ich ernst. In letzter Zeit bin ich irgendwie im Optimierungswahn und wie ich besser programmieren kann. Hat mit Forward Declaration und so wenig wie möglich im hpp zu inkluden angefangen.



  • @KK27 Ich denke da werden die Meinungen wohl auseinander gehen. Einerseits ist so eine 0 natürlich sehr kurz zu schreiben und deren Konvertierung auch eindeutig und "verlustfrei" für Integer-, Floating-Point oder auch Typen wie std::complex. Daher werden einige wahrscheinlich sagen, dass der explizite Cast unnötig ist und nur der Lesbarkeit schadet.

    Ich persönlich bevorzuge allerdings oft solche expliziten Casts, besonders auch im Kontext von Floating–integral conversions. Der Grund ist, dass ich gerne bewusst im Code dokumentiere, welche Form der Konvertierung ich beabsichtige und in welchem Datentyp die eigentliche Berechnung stattfinden soll. Auch wenn ich damit nur die vom Compiler automatisch durchgeführten, impliziten Konvertierungen nachbilde. Erstens mache ich mir damit selbst noch einmal Gedanken darüber, wie die korrekte Berechnung auszusehen hat und zweitens signalisiere ich damit einem Leser des Codes, dass diese tatsächlich so beabsichtigt sind - inklusive der Rundungs- und Konvertierungs-Problematiken, die sich dabei evtl. auftun.

    Aber es stimmt schon, dass zu viele triviale C++-Casts mehr "Code-Rauschen" verursachen. Vielleicht nicht unbedingt bei so simplen Dingen wie 0 in einen short.



  • @KK27 sagte in Eine Frage zu Integer Typen Initialisierung und Suffix.:

    Übertreibe ich ?

    Ja. Es gibt keinen Unterschied zu einem einfachen = 0 in deinem Code. Und ich finde kürzer hier besser. Du könntest auch mit {0} initialisieren. Bei großen Zahlen wäre das sogar hilfreich. Aber 0 kennen alle int-Typen.

    Wenn du mit auto arbeiten willst, dann wird das natürlich wichtig.

    const auto temp1 = 0;
    const auto temp2 = 0LL;
    

    Aber sonst? Einfach 0 schreiben. Man muss C++ meiner Meinung nach nicht komplizierter machen, als es ist. Meistens ist doch das Setzen auf 0 das Relevante im Code und nicht, welcher Typ genau es die 0 sein soll. Der Typ der Variablen kann wichtig sein.



  • Bei "Rechnungen" kann es wichtig sein die entsprechenden Suffixe zu verwenden, also 1024 * 1024 * 1024 * 1024 ist nicht das was man erwartet, 1024LL * 1024 * 1024 * 1024 dagegen schon.

    Aber bei einfachen Konstenten ist es egal, so lange keine Type-Deduction (auto, templates) oder Overload Resolution davon abhängt.



  • @wob sagte in Eine Frage zu Integer Typen Initialisierung und Suffix.:

    Wenn du mit auto arbeiten willst, dann wird das natürlich wichtig.

    Stimmt. Daran habe ich noch gar nicht gedacht.

    Ich denke damit ist meine Frage beantwortet, sofern es nicht noch weitere interessante Situationen/Fälle gibt, wo es auch noch wichtig sein könnte.


Anmelden zum Antworten