if???



  • Hi,
    kann man davon ausgehen, dass der Code in den Klammern immer ausgeführt wird???

    int i=1;
    if(i)
    {
    }
    
    int i=0;
    if(!i)
    {
    }
    
    int i=IrgendwasUngleichNull;
    if(i)
    {
    }
    


  • Ich denke mal dass der Compiler da bestimmte Sachen wegoptimieren darf, aber wichtige Sachen wie irgendwelche Funktionen die Attribute von Klassen ändern und was-weiß-ich-nicht trotzdem ausführen muss um den Programmfluss zu erhalten.



  • Ja, aber probier es doch aus 🙂 Wobei natürlich die boolische Anordnung gilt (Bindungsordnung).

    bool bar(std::size_t i) { std::cout << i << std::endl; return true; }
    
    int main()
    {
        if (bar(1) && !bar(2) || !bar(3)) std::cout << "1, 2, 3" << std::endl;
        if (bar(1) || bar(2)) std::cout << "1, 2" << std::endl;
    }
    

    ...



  • Das ist mir klar 😕 Die Frage ist eher, ob der Standard das so garantiert und ich bei Compilerwechsel meinen Code nicht ändern muss...



  • Welcher Teil des if() ist dir denn unklar?

    C(89) kannte noch keinen eigenständigen bool-Typ, darum hat es alle Bool-Berechnungen mit Integern durchgeführt - 0 wird als false bewertet, jeder andere Wert als true (boolesche Operatoren (&&, ||, !) und Vergleiche liefern afaik 0 oder 1 zurück). Und dieses Verhalten wurde auch von C++ übernommen (aus Kompatibilität und weil "if(i)..." kürzer ist als "if(i!=0)...").


Anmelden zum Antworten