[quote=Dieter,17.06.2004, 13:42]Sorry - aber es ist müßig darüber weiter zu diskutieren.
Jeder kann seine IF-Bedingungen so formulieren wie er mag - entscheidend ist allein das Ergebnis ... (und dann kann man ja immer noch nachbessern) ;)[/quote]
Ups, da hab ich ja ganz unbeabsicht Abgründe in Deinem Wissen über boolsche Algebra aufgetan :-O
Denn wie Taulmarill schon sagte:
[quote=Taulmarill,17.06.2004, 11:14]da
and stärker bindet als
or kann man die klammern um die
and schon mal weg lassen, auch die "dreifach-klammern" sind unnötig. damit sind wir bei
if ( ( a and b or c and d ) or e ) {}
ich behaupte nun, dass
identisch ist mit
damit können wir auch das letzte klammernpaar weglassen und haben nur noch die klammern vom if.
if ( a and b or c and d or e ) {}
[/quote]
liefern alle drei Ausdrücke
genau dann wahr, wenn mindestens eine der Bedingungen a, b oder c wahr ist. (Sowas lässt sich leicht nachprüfen über Wahrheitstabellen, falls man mit der Logik dahinter noch Probleme hat.
Und aufgrund der Kurzschlußtechnik wird b und c nicht weiter geprüft, falls a schon wahr ist. Deshalb muss man es auch anders machen, wenn da nicht einfache Ausdrück stehen, sondern Funktionsergebnisse, und man möchte, dass alle drei Funktionen auf jeden Fall ausgeführt werden.
In diesem Fall führt man die Funktionen erst aus, wobei man sich die Ergebnisse merkt und testet dann mit if.
[quote=Dieter,17.06.2004, 12:52]Kommt drauf an was man mit der Bedingung sagen will
print "true\n" if ($a and $b) or $c;
prüft erst ob $a und $b sich in einem definierten Zustand befinden und sieht sich in jedem Falle auch $c an.
print "true\n" if ($a and $b) || $c;
sieht sich $c nur dann an wenn die geklammerte Bedingung nicht zutrifft.
print "true\n" if $a and $b or $c;
liefert true wenn $a oder $b oder $c definiert ist
usw.[/quote]
Falsch, in allen drei Fällen wird $c nur genau dann geprüft, wenn $a oder $b falsch sind. Sind beide richtig, wird $c nicht angesehen.
Insbesondere Deine letzte Aussage
> print "true\n" if $a and $b or $c;
> liefert true wenn $a oder $b oder $c definiert ist
Ist ganz falsch, was passiert denn wohl, wenn $b wahr und $a und $c falsch sind? Richtig, der Gesamtausdruck ist dann falsch, im Gegensatz zu Deiner Aussage.
Und wieso überhaupt "definiert" - hier geht es um wahr oder falsch, und undef ist nur einer der möglichen falschen Werte.
[quote=Dieter,16.06.2004, 17:09]Im Falle von
if ( ((( ($a && $b) || ($c && $d) ))) || $e ) {...}
sorgt es nicht nur für Klarheit sondern ist sogar zwingend erforderlich ;)[/quote]
Diese Aussage ist schlicht falsch, es sei denn, sie bezog sich nicht auf das Beispiel, sondern auf alle möglichen Fälle von Abfragen (natürlich gibt es Abfragen, wo ohne Klammern eine andere Logik entsteht als mit Klammern).
So, ich möchte hiermit keinesfalls die Stimmung anheizen, ich denke nur, dass es wichtig ist, sich hierüber gut auszukennen als Programmierer. Als Mathematiker lernt man das halt schon ausführlich im Studium, aber auch sonst sollte man sich in boolscher Algebra auskennen.
Also bitte nicht angegriffen fühlen und nicht aufregen, sondern die Anregung aufnehmen, nachlesen und nachlernen.
(Oder halt dauernd redundante Klammern setzen, aber ich hasse das ;-)\n\n
<!--EDIT|Crian|1087516558-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite