Pointeroperationen assoziativ?



  • Also

    std::vector<int> v(1243);
    int m = // Negativer Index eines Elements
    int *p1 = v.data() + m-1 + v.size(); // UB?
    int *p1 = v.data() + (m-1 + v.size()); // ok?
    

    Muss ich jetzt jedesmal die Klammern hinschreiben?



  • In C++ ist ueberhaupt nichts (a priori) assoziativ. Also wenn du nichts findest, das dafuer spricht, dann spricht alles dagegen.



  • Variante 1 sollte imo UB sein, Variante 2 sollte ok sein, solange der Ausdruck in Klammern einen gültigen Index in den vector ergibt.



  • std::vector::size() liefert einen unsigned zurueck. Ist irgendwo spezifiziert, wie signed und unsigned in einer Addidtion promoted werden. Persoenlich hatte ich da eine schlechte Erfahrung, dass das Ergebnis implizit ein unsigned war.



  • Es gibt allerdings die one-past-Regel, heißt

    int* p1 = v.data() + v.size() + m - 1;
    

    geht klar.


Log in to reply