Vereinfachung rückgängig



  • Wie kann man diese Vereinfachung vereinfachen???

    z -= (w *= x) /= (y += z);

    Danke schon mal im voraus!!!



  • meine rückgängig machen



  • allsoooo
    zuerst wird w *= x gemacht,
    also w = w * x
    dann y += z
    also y = y + z
    dann wird w / z gerechnet, das ergebniss in einer temp variable gespeichert ( t )
    dann wird z -= t
    also z = z - t gemacht
    auf jeden fall wird zuerst w dann y verändert, dann wird z mit diesen veränderten var. berechnet

    wer hat sich so einen unleserlichen code überhaupt ausgedacht?

    im übrigen ist das keine vereinfachung sondern eine unlesemachung. der compiler müsste den gleichen code generieren, wenn man alles normal schreiben würde.



  • Garnicht, weil der Code nicht gültig ist. w *= x ist kein lvalue.



  • 0xdeadbeef schrieb:

    Garnicht, weil der Code nicht gültig ist. w *= x ist kein lvalue.

    Er funktionier aber.
    Aber frag mich jetzt nicht, warum 😉

    Das (w *= x) ändert den Wert von w auch nicht. 😕


  • Mod

    w *= x;
    y += z;
    w /= y;
    z -= w;
    

    w *= x liefert eine referenz auf w und nicht bloss den nackten wert - ist also durchaus ein l-value.

    solche konstrukte sind im übrigen sehr gefährlich:

    int z = 1;
        z = ( ( z += 5 ) * ( z += 2 ) );
        cout << z;
    

    das ergebnis hängt hier vom compiler ab - gcc und icc liefern hier 48, msvc dagegen 64.



  • Dann lest nochmal im Standard nach, Zuweisungen sind keine lvalues. Im Übrigen:

    $ cat t.c
    int main(void) {
      int w, x, y, z;
      z -= (w *= x) /= (y += z);
    }
    $ gcc-3.4 t.c
    t.c: In function `main':
    t.c:3: Fehler: invalid lvalue in assignment
    $ gcc-3.3 t.c
    t.c: In Funktion »main«:
    t.c:3: error: invalid lvalue in assignment
    $
    


  • und wie heißt dieser quellcode ausgeschrieben???

    (mir ist diese Art zu unverständlich)...

    d = 2 > 3 && 4 != 5 || !true != true;



  • d = true;
    

    && bindet stärker als ||, und die Vergleichsoperatoren binden stärker als beide. Also steht da anders geklammert so viel wie

    d = ((2 > 3) && (4 != 5)) || (!true != true);
    

    was ziemlich offensichtlich true ist.


  • Mod

    das hier aus msdn - ja ich weiss, dass da manchmal fehler sind...

    C++ Language Reference

    Result of Assignment OperatorsSee Also
    Expressions with Binary Operators
    The assignment operators return the value of the object specified by the left operand after the assignment. The resultant type is the type of the left operand. The result of an assignment expression is always an l-value. These operators have right-to-left associativity. The left operand must be a modifiable l-value.

    Note In ANSI C, the result of an assignment expression is not an l-value. Therefore, the legal C++ expression (a += b) += c is illegal in C.

    und auch mit diesem quelltext:

    int main(void) {
      int w, x, y, z;
      z -= (w *= x) /= (y += z);
    }
    

    einmal als main.c und einmal als main.cpp

    C:\Programme\Dev-Cpp\projekte>..\bin\gcc main.c
    main.c: In function `main':
    main.c:4: error: invalid lvalue in assignment
    
    C:\Programme\Dev-Cpp\projekte>..\bin\gcc main.cpp
    

    kein fehler im zweiten fall. und irgendwie sind wir hier doch im c++ forum.


Anmelden zum Antworten