Lektion 17:

Logische Ausdrücke

 Wann hat der Februar 29 Tage?

Das ist der Fall, wenn die Jahreszahl durch 4 teilbar ist, aber wenn sie durch 100 teilbar ist, dann nicht, außer wenn sie durch 400 teilbar ist.

1995:   kein Schaltjahr
1996:   Schaltjahr
1900:   kein Schaltjahr
2000:   Schaltjahr

Eine mögliche Implementierung ist:

bool istSchaltjahr(int jahr)
{
   bool schaltjahr=false;
   if(jahr%4==0)
   {
      schaltjahr=true;
      if(jahr%100==0)
      {
         schaltjahr=false;
         if(jahr%400==0)
         {
            schaltjahr=true;
         };
      };
   };
   return schaltjahr;
};

 Das ist die fast direkte Übersetzung der obigen Definition. Deshalb ist sie gut. Die obige Definition kommt noch als Kommentar herein und jeder versteht die Funktion. Man kann solche komplexen Bedingungen aber auch mit logischen Ausdrücken formulieren (und oft sollte man es):

Werte vom Typ bool können mit den Operatoren && (logisches und), ¦¦ (logisches oder) und ! (logisches nicht) verknüpft werden. Damit können wir uns eine kleine Funktion basteln, die sagt, ob ein bestimmtes Jahr ein Schaltjahr ist:

Der Ausdruck

a&&b

ist nur dann true, wenn a==true und b==true.

Der Ausdruck

a¦¦b

ist true, wenn a==true oder b==true (auch, wenn beide gleich true sind).

Der Ausdruck

!a

ist genau dann true, wenn a false ist.

Ausdruck: a&&b (logisches und)
--------------------------
  a   ¦   b   ¦ Ergebnis
--------------------------
true  ¦ true  ¦ true
false ¦ true  ¦ false
true  ¦ false ¦ false
false ¦ false ¦ false
Ausdruck: a¦¦b (logisches oder)
--------------------------
  a   ¦   b   ¦ Ergebnis
--------------------------
true  ¦ true  ¦ true
false ¦ true  ¦ true
true  ¦ false ¦ true
false ¦ false ¦ false
Ausdruck: !a (logisches nicht)
------------------
  a   ¦ Ergebnis
------------------
true  ¦ false
false ¦ true
bool istSchaltjahr(int jahr)
{
   return (jahr%4==0 && jahr%100!=0) ¦¦ jahr%400==0;
};

Und wir haben mit Sicherheit erreicht, daß der Code schwierig zu lesen ist. Besonders in Bedingungen kommt es zu wahren Meisterschaften des Rätselaufgebens, obwohl es oft viel einfacher ginge.

Bedingung unschön:                      Bedingung schön:
if(0<=a-b)                              if(a<=b)
if(a/b>1)                               if(a>b) // es war hier klar, daß a>0&&b>0
if(5<=a)                                if(a>=5)
if(a>=5 ¦¦ a<=7)                        if(true) // und if(true) fällt ganz weg

Nach langem Rätseln konnte ich mich mit folgender istSchaltjahr-Funktion am ehesten anfreunden:

bool istSchaltjahr(int jahr)
{
   if(jahr%400==0return true;
   if(jahr%100==0return false;
   if(jahr%  4==0return true;
   return false;
};

 Die return-Befehle sind nicht korrekt eingerückt. Aber dem Compiler macht das nichts, und ich finde es hübsch, weil es die gleichartige Struktur dieser Zeilen deutlich zur Geltung bringt.

Für Freunde des Wortes else:

bool istSchaltjahr(int jahr)
{
   if(jahr%400==0return true;
   else
      if(jahr%100==0return false;
      else
         if(jahr%4==0return true;
         else return false;
};

Einsendungen:

logische Ausdrücke besser als if?
short-cirquit-Auswertung?


Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00