Vergleich und Zuweisung kombinieren



  • Hallo,

    ist es möglich innerhalb einer Bedingung eine Zuweisung durchzuführen?
    Beispiel:

    int err;
    if (err=init()!=0)
       debug(err);
    

    Der compiler liefert:

    suggest parentheses around assignment used as truth value
    

    Also hab ich die Zuweisung geklammert.

    int err;
    if ((err=init())!=0)
       debug(err);
    

    Dann kommt keine Warnung mehr. Allerdings tut er dann auch das was ich von ihm will?

    Gruß
    Kai



  • Das geht schon, aber warum willst du das so machen? Das kenn ich von alten C-Programmen.
    Es ist leichter zu durchschauen und zu debuggen wenn man Zuweisung und Vergleich trennt.



  • HBaerbel schrieb:

    Dann kommt keine Warnung mehr. Allerdings tut er dann auch das was ich von ihm will?

    Kommt drauf an was du von ihm willst. Wenn du (wie ich vermute) err den Wert von init zuweisen willst und dann das Ergebnis mit 0 vergleichen, ist das richtig. Wenn du init mit 0 vergleichen willst, das (bool)Ergebnis dann an err zuweisen und das dann als boolschen Ausdruck für dein if verwenden willst, musst du die Klammern ander setzen (um den Vergleich).

    So oder so ists schlechter Stil, trenne die Zuweisung und den Vergleich.

    int err = init();
    if (err != 0)
    {
      /* ... */
    }
    


  • Es spart eine Zeile Code....

    int err;
    err=init();
    if (err!=0)
       debug(err);
    

    Außerdem wird es, wie ich finde, übersichtlicher. Vor allem wenn viele statische C-Funktionen nacheinander aufgerufen werden müssen.

    int err;
    if ((err=init())!=0)
       debug(err); 
    if ((err=connect())!=0)
       debug(err); 
    if ((err=send())!=0)
       debug(err); 
    if ((err=close())!=0)
       debug(err);
    

    mfG
    Kai



  • HBaerbel schrieb:

    Es spart eine Zeile Code....

    int err;
    err=init();
    if (err!=0)
       debug(err);
    

    Das ist ein Punkt. Sag mir doch mal den Autor Deines C++-Buches. Es riecht so nach C.



  • HBaerbel schrieb:

    Es spart eine Zeile Code....

    int err;
    err=init();
    if (err!=0)
       debug(err);
    

    Nein

    int err = init();
    if (err!=0)
       debug(err);
    


  • Wenn man es trennt müsste es doch so aussehen, oder?

    int err=init();
    if (err!=0)
       debug(err);
    err=connect();
    if ((err!=0)
       debug(err);
    err=send();
    if (err!=0)
       debug(err);
    err=close();
    if (err!=0)
       debug(err);
    

    Ist das nicht deutlich mehr Code als das:

    int err;
    if ((err=init())!=0)
       debug(err);
    if ((err=connect())!=0)
       debug(err);
    if ((err=send())!=0)
       debug(err);
    if ((err=close())!=0)
       debug(err);
    

    Aber meine Frage ist mit dem ersten Post eigentlich schon beantwortet.

    Dank und Gruß
    Kai



  • Für ähnliche Fälle hat man in C++ Ausnahmen erfunden.



  • Wenns ums Zeilensparen geht, warum nich sowas in der Art:

    void Check(int err)
    {
       if( err != 0 ) debug(err);
    }
    
    [...]
    
    Check(init());
    Check(connect());
    Check(send());
    Check(close());
    

    Find ich erheblich übersichtlicher...



  • Ich kann noch besser Zeilen sparen:

    {int err=init();if (err!=0)debug(err);}{int err=connect();if (err!=0)debug(err);}{int err=send();if (err!=0)debug(err);}{int err=close();if (err!=0)debug(err);}
    


  • HBaerbel schrieb:

    ist es möglich innerhalb einer Bedingung eine Zuweisung durchzuführen?
    Beispiel:

    int err;
    if (err=init()!=0)
       debug(err);
    

    Ja, für den besonderen Fall, daß es um !=0 geht, kann man sogar eine Definition im if machen.

    if (int err=init())
       debug(err);
    

    Aus welcher Quelle lernst Du zur Zeit C++?



  • [quote="volkard"]

    HBaerbel schrieb:

    Aus welcher Quelle lernst Du zur Zeit C++?

    Ich schreibe schon seit mehr als 10 Jahren hin und wieder C++ Code. Ich konnte mich dunkel errinnern solche Zuweisungs-Vergleichs-Konstrukte schon einmal verwendet zu haben. Allerdings war ich mir nicht mehr ganz sicher ob, und wenn ja, welche Programmiersprache das war 😉

    Nochmal Danke!

    Gruß
    Kai


Anmelden zum Antworten