richtig oder falsch?



  • Hi,

    wie caste ich in C++ richtig nach dem Standard?

    // so?
    double x = 1.5;
    float y = (float)x;
    
    // oder so?
    double x = 1.5;
    float y = float(x);
    


  • Steht in der FAQ.

    Mit

    static_cast<Typ>(Ausdruck)
    reinterpret_cast<Typ>(Ausdruck)
    dynamic_cast<Typ>(Ausdruck)
    

    Mit der C Variante die Zweite, weil die typensicherer ist.



  • C Newbie schrieb:

    Mit der C Variante die Zweite, weil die typensicherer ist.

    1. das zweite ist keine C-Variante
    2. wieso soll das typensicherer sein?


    1. wieso soll das typensicherer sein?

    Vielleicht im Sinne von "kann weniger". Mit einem C-Cast kann ich ja z.B. einen int in einen int-Pointer casten. Das kann ich mit der functional notation aber nicht.



  • die beiden sind gleich.



  • C Newbie schrieb:

    die beiden sind gleich.

    Welche beiden sind gleich?

    Bei der zweiten Variante, wird dich, wenn ich mich nicht irre, der Compiler
    von so manchem Cast abhalten, bei ersterem nicht.

    mfg
    v R



  • virtuell Realisticer schrieb:

    C Newbie schrieb:

    die beiden sind gleich.

    Welche beiden sind gleich?

    Bei der zweiten Variante, wird dich, wenn ich mich nicht irre, der Compiler
    von so manchem Cast abhalten, bei ersterem nicht.

    mfg
    v R

    float y = (float)x;
    und
    float y = float(x);
    sind gleich.

    steht explizit so im standard. woher das gerücht kommt, an das ich auch bis vor kurzem gleibte, die zweite version sei sicherer, weiß ich nicht. es gehen gerüchte um, das habe im struppi gestanden.



  • Warum wird bei dem einen einfach gecastet und bei dem anderen kann es zu
    Compilerfehlern kommen? Oder ist das nicht so?

    Scheint, als kenne ich auch nur die falsche Wahrheit 😉

    mfg
    v R



  • HumeSikkins schrieb:

    Mit einem C-Cast kann ich ja z.B. einen int in einen int-Pointer casten. Das kann ich mit der functional notation aber nicht.

    Doch, es macht nur niemand:

    int n = 12;
    int *p = int*(n); /* Syntaxfehler */
    typedef int *intp;
    intp q = intp(n);
    


  • theoretisch kann man doch auch

    int *p=(int*)(n);
    

    schreiben, wobei ich mir nicht sicher bin ob das nicht nacher doch als

    int *p=(int*)n;
    

    interpretiert wird 🙂



  • Spielt das eine Rolle? Kommt eh das gleiche raus, weil ein T(e) Ausdruck bei eingebauten Typen als (T)e definiert ist.



  • Ich schrieb:

    Mit einem C-Cast kann ich ja z.B. einen int in einen int-Pointer casten. Das kann ich mit der functional notation aber nicht.

    Daniel E. schrieb:

    Doch, es macht nur niemand:

    Oha. Trotz der unzähligen Bücher und Artikel die ich zum Thema C++ gelesen habe, habe ich immer noch keine Ahnung von solchen einfachen Basissachen 😞

    Naja, auf jeden Fall danke für den Hinweis 🙂



  • C Newbie schrieb:

    die beiden sind gleich.

    😮 😕
    Hab gar nicht gewust das ich das geschrieben habe.
    Ich habe ungefähr zu der Zeit zwar etwas geschrieben, aber das war doch schon
    etwas anders.
    Wie kann das sein ?



  • volkard schrieb:

    float y = (float)x;
    und
    float y = float(x);
    sind gleich.

    steht explizit so im standard. woher das gerücht kommt, an das ich auch bis vor kurzem gleibte, die zweite version sei sicherer, weiß ich nicht. es gehen gerüchte um, das habe im struppi gestanden.

    Also ich wurde so vor ca. 8-9 Monaten hier tierisch zur Sau gemacht weil ich die erste Variante benutzt habe um ein int in eine Fließkommazahl zu casten und auf _alle_ erdenklichen Schwachstellen hingewiesen und jetzt sollen sie doch gleich sein? 😕



  • ich glaub da ging es um C-style cast vs. static_cast



  • da ging es aber um c-cast vs. reinterpret/static/dynamic/const_cast



  • Der "Struppi" sagt dazu auf Seite 140 (4. Auflage):

    C++ hat von C die Schreibweise (T)a geerbt, die jede Konvertierung ausführt, die als Kombination von static_cast, reinterpret_cast und const_cast ausgeführt werden kann, um einen Wert des Typs T aus dem Audruck a zu erzeugen (§B.2.3). Dieser C-Cast ist sehr viel gefährlicher als die bekannten Konvertierungsoperatoren, da die Schreibweise viel unauffälliger ist und die vom Programmierer beabsichtigte Konvertierung nicht explizit ausgeschrieben ist. Das heißt, (T)a könnte eine portable Konvertierung zwischen verwandten Typen sein, eine nicht portable Konvertierung zwischen nicht verwandten Typen oder das Entfernen von const von einem Zeigertyp. Ohne die genauen Typen von T und a zu kennen, kann man dies nicht entscheiden.



  • und? da kommt ja nur (T)a vor, hier geht es um unterschiede.
    vielleicht sind die nur fuer eingebaute typen gleich? fuer klassen ist ja T(a) ein ctor aufruf, wird (T)a automatisch in einen solchen umgemodelt? oder werden vielleicht nur die bits reinterpretet?



  • und? da kommt ja nur (T)a vor, hier geht es um unterschiede.

    Wenn du mal 5 Posts zurück blätterst dann wirst du sehen, dass es darum geht, dass float(integer) und (float)integer gleichbedeutend sind und zweiteres keineswegs unsicher ist. Volkard meinte das Gerücht mit der Unsicherheit kam aus dem Stroustrup und ich habe eine Stelle abgetippt um zu zeigen, dass dem nicht so ist. Im Stroustrup steht, dass der C-Cast als eine mögliche Kombination von static_cast, reinterpret_cast und const_cast interpretiert wird. In Problemfällen castet dieser also fleißig um alle Ecken rum und ist _nur_ deshalb so gefährlich. Bei dem Cast (float)integer wird aus dem berüchtigten C-Cast ein static_cast 😉 .



  • verstehe ich nicht. beweis durch beispiel gibt es nicht, nur beweis durch gegenbeispiel.


Anmelden zum Antworten