Auswertungsreihenfolge



  • Ich werte zwei Bedingungen aus:

    A

    if (a != 0) {
      if (b / a == c) {
        // alles ok
      }
    }
    

    Wie sieht es jetzt aus, wenn ich beide Bedingungen in einer Anweisung verknüpfe:

    B

    if (a != 0 && b / a == c) {
      // alles ok
    }
    

    Den Fall B würde ich so nie bauen, da es mir zu unsicher wäre (Division durch Null). Kann ich mich darauf verlassen, dass die Auswertungsreihenfolge vom Compiler unbedingt eingehalten wird?

    Bei mir ist das Problem, dass die Auswertung von notwendigen und hinreichenden Bedingungen immer strikt voneinander getrennt sein muss!

    Danke für eure Hilfe!



  • && trennt strikt, denn im && ist ein sequence point und && wertet den zweiten ausdruck nur aus, wenn der erste nicht schon zu einem klaren ergebnis führt.



  • Tomahawk schrieb:

    if (a != 0 && b / a == c) {
      // alles ok
    }
    

    💡

    if ( b == a * c ) {
      // alles ok
    }
    


  • DANKE!


  • Mod

    volkard schrieb:

    Tomahawk schrieb:

    if (a != 0 && b / a == c) {
      // alles ok
    }
    

    💡

    if ( b == a * c ) {
      // alles ok
    }
    

    Das macht aber was anderes, wenn a == 0 und b == 0.



  • camper schrieb:

    Das macht aber was anderes, wenn a == 0 und b == 0.

    Nicht nur dann.

    Wenn es sich um Integers handelt (was ich vermute, da sonst die Prüfung auf Gleichheit nicht viel Sinn machen würde), besitzen die beiden Codes ebenfalls eine unterschiedliche Semantik. Ausserdem läuft man bei grösseren Zahlen die Gefahr eines Overflows, wenn die Multiplikation eingesetzt wird.


Log in to reply