int* i oder int *i ?



  • Helium schrieb:

    C'ler sahen das anders: *i ist vom Typ int.

    Das sahen aber nur echte Profis so. Die anderen haben einfach sich die Regeln gemerkt und sich gewundert, warums so unintuitiv ist.



  • beides ist richtig, was du nimmst hängt von dem Stil ab. Ich bevorzuge die erste Variante.
    Und hier was Stroustrup dazu sagt: http://www.research.att.com/~bs/bs_faq2.html#whitespace



  • Das größere Problem ist die Mehrdeutigkeit von * und & in C++. Wohin man die Zeichen packt, ist reine Geschmacksache. Für alle vier Versionen findet man Befürworter und Gegner. Ich präferiere int& x und int* x auf Grund der Typ-Bezogenheit in C++.



  • Trotzdem finde ich es falsch, weil das & bzw. das * sich auf genau die folgende (und nur diese) Variable bezieht und nicht auf den Typ.

    Schreibst du vielleicht

    int& i, & j;
    

    P.S. diesen Thread bitte nicht zu ernst nehmen 😉



  • Der offizielle Codingstyle besagt, dass nur

    int *i;
    

    richtig ist. Alle anderen Schreibweisen sind schlichtweg falsch!

    Denn dieses kann zu erheblichen Fehlern führen:

    int* i, j;
    

    Hm, i ist ein pointer, j müsste vom Aussehen her auch einer sein, ist aber KEIENR! Ist aber aus der Deklaration so nicht einfach zu erkennen und verwirrt auf den ersten Blick.



  • Deswegen deklariert man ja auch Variablen so:

    int* i; // Eventuelle Erklärung
    int* j; // Eventuelle Erklärung
    int k; // Eventuelle Erklärung
    

    😉

    MfG SideWinder



  • Mach doch:

    template <typename T>
    struct Ptr {
       typedef T* Type;
    };
    
    Ptr<int>::Type i, j;
    


  • Super 😉
    Leserlicher kann man es ja gar nicht mehr schreiben. Beim programmieren geht es nicht darum, zu demonstrieren, wie kompliziert man Sachen darstellen kann und noch durchblickt.



  • Helium schrieb:

    Mach doch:

    template <typename T>
    struct Ptr {
       typedef T* Type;
    };
    
    Ptr<int>::Type i, j;
    

    Wo hier der Sinn sein soll fragt man sich dann aber doch. Nichts gegen schöne lange Templates aber das hier finde ich einfach nur dumm 🙄

    MfG SideWinder



  • Ich würde ja ein

    template <typename T> 
    struct As { 
       typedef T * Pointer;
       typedef T * const Const_Pointer;
    }; 
    
    As<int>::Pointer i, j;
    

    bevorzugen 😉
    Noch ein paar Makros um die < und >:: herum und wir haben eine
    sehr ausdruckskräftiges C++ erschaffen 😃



  • FQT schrieb:

    Alle anderen Schreibweisen sind schlichtweg falsch!

    Mit der Äußerung hast du dir ein 🙄 verdient.



  • Die aggressive Emotionalität, mit der hier argumentiert wird, und die Verwendung verschiedener Stile in der Fachliteratur demonstriert, dass C++ hier ein Ernst zu nehmendes historisch gewachsenes Krebsgeschwür hat. Das lässt sich nicht einfach durch Diskussion in einem Forum lösen, das muss heraus geschnitten werden.



  • Ja ne is klar.



  • Super
    Leserlicher kann man es ja gar nicht mehr schreiben. Beim programmieren geht es nicht darum, zu demonstrieren, wie kompliziert man Sachen darstellen kann und noch durchblickt.

    Wo hier der Sinn sein soll fragt man sich dann aber doch. Nichts gegen schöne lange Templates aber das hier finde ich einfach nur dumm

    Jemand wollte ein Template-Typedef um sich ein Ptr<T> zu basteln. Mit meiner Variante schreibt man halt Ptr<T>::Type.

    Natürlich ist Davies Variante besser, aber nicht so nah an dem geforderten.

    Zeiger auf Zeiger sähen aber in jedem Fall etwas unübersichtlich aus:

    Ptr<Ptr<int>::Type>::Type p;
    As<As<int>::Pointer>::Pointer p;
    

    Ist sicher geschamckssache. Mit Template-Typedefs sächs was hüscher aus.



  • sollte nicht ganz so ernst gemeint sein.
    aber mit deinem letzten codebeispiel sehe ich keine probleme.
    einfach kreativ sein:

    template <class T>
    struct Ptr {
    	typedef T * Type;
    };
    
    template <class T>
    struct Ptr<Ptr<T> > {
    	typedef typename Ptr<T>::Type * Type;
    };
    
    int main() {
    	int ** i = 0;
    	Ptr<Ptr<int> >::Type j = i; //also entweder so
    	Ptr<int*const>::Type k = j; //oder einfach so
            int const * const * const l = k; //ok das ist überspitzt :D
    }
    

    😉



  • rofl



  • Wer intellektuell wirken will, schreibt:

    datentyp * pointer_auf_datentyp;



  • Was hat das denn mit intellektuell zu tun?


Anmelden zum Antworten