Überflüssiges Statement??



  • Ich muss mich gerade durch fremden Code arbeiten und habe folgendes entdeckt:

    void myClass::doSth(uint8_t value) {			
    		//[hier passieren erst andere Dinge, aber value wird 100% nicht angefasst
    
    		// value normieren (<-- Originalkommentar)
    		value= !!value;
    
                    // Value wird verwendet
    

    Meiner Meinung nach gibt es keinen Fall wo "!!" irgendwas verändern kann, oder? Ich sehe das als überflüssiges Statement an. Testweise habe ich die Zeile auskommentiert und augenscheinlich liefert das Programm dieselben Ergebnisse.

    Bin ich jetzt blind oder was ist der Sinn von der doppelten Negotation?



  • !!5 == 1
    Wenn value 0 ist, dann bleibt es 0, ansonsten wird es 1.



  • besten dank!



  • nwp3 schrieb:

    !!5 == 1
    Wenn value 0 ist, dann bleibt es 0, ansonsten wird es 1.

    Wo liegt das der Sinn?



  • Das hängt ja nun stark davon ab, was unter "// Value wird verwendet" passiert. Aber mir fallen spontan 2 Anwendungsfälle ein:

    1. Der nachfolgende Code kann nur mit 0 und 1 als Input umgehen (ist hier wohl nicht der Fall)

    2. Um zu dokumentieren: value wird als boolesche Variable verwendet.



  • Angenommen, es macht wirklich Sinn, dann würde ich es trotzdem nicht so machen. Sieht man ja, bringt nur Obfuscation.



  • out schrieb:

    Angenommen, es macht wirklich Sinn, dann würde ich es trotzdem nicht so machen. Sieht man ja, bringt nur Obfuscation.

    MSVC hat immer rumgewarnt bei

    value=bool(value);
    

    Man würde evtl signifikante Stellen verlieren.
    Mit !! war die Wanung dann weg.



  • volkard schrieb:

    MSVC hat immer rumgewarnt bei

    value=bool(value);
    

    Man würde evtl signifikante Stellen verlieren.
    Mit !! war die Wanung dann weg.

    Stimmt, macht er noch immer: warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)



  • SG1 schrieb:

    Das hängt ja nun stark davon ab, was unter "// Value wird verwendet" passiert. Aber mir fallen spontan 2 Anwendungsfälle ein:

    1. Der nachfolgende Code kann nur mit 0 und 1 als Input umgehen (ist hier wohl nicht der Fall)

    2. Um zu dokumentieren: value wird als boolesche Variable verwendet.

    Nee nee es war tatsächlich Fall 1, der Code behandelt nur 0er und 1er und deswegen wird wohl eine "versehentliche Übergabe" von z.B. 178 in 1 umgewandelt



  • out schrieb:

    Stimmt, macht er noch immer: warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

    Ja, die Warnung trotz Cast ist Absicht.

    Verwirrter schrieb:

    deswegen wird wohl eine "versehentliche Übergabe" von z.B. 178 in 1 umgewandelt

    Du Funktion versteckt also Fehler bei der Übergabe. Das ist nichts Gutes.

    Nie nie nie Logikfehler geradebiegen. Da gehört ein assert(value <= 1); hin, alles andere ist Wahnsinn.


Anmelden zum Antworten