[gelöst] Bug bei booleschen Operationen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

[gelöst] Bug bei booleschen Operationen?

Beitrag von mintpc »

Hallo zusammen,

ich hatte zufällig das hier getippt:

Code: Alles auswählen

  if (4 or 5=5) then
     writeln ('Funktioniert')
  else
    writeln('Funktioniert nicht');     
und das Fragment kompiliert und gibt "Funktioniert" aus.

Das müsste doch eigentlich einen Fehler geben, weil "or" Wahrheitswerte
vergleicht und 4 kein Wahrheitswert ist.

Ist das ein Bug?

Gruß
mintpc
Zuletzt geändert von mintpc am Do 9. Okt 2014, 09:07, insgesamt 1-mal geändert.

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bug bei booleschen Operationen?

Beitrag von Mathias »

Nein, ist es nicht.
Du prüfst, ob 4 or 5 der gleiche wert wie 4 ergibt.

Gib mal folgendes ein:

Code: Alles auswählen

    writeln(4 or 5);
Das or ist in dem Fall ein Operater , so wie ein +, -, etc.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Bug bei booleschen Operationen?

Beitrag von mintpc »

Danke erstmal für die Antwort,

aber das raffe ich nicht. Klar ist mir, dass
zuerst das "or ausgewertet wird, da "or" stärker
bindet als der Vergleich.

Aber, wie gesagt, das "or" liefert doch true oder false, was nicht
mit einer Zahl verglichen werden kann.

So, und nun:
writeln (4 or 5) gibt die 4 aus,
writeln (5 or 4) gibt die 5 aus.

Da sehe ich den Operator "or" nicht. Es wird hier doch irgendwie
nur die erste Zahl ausgegeben.

Ich steh total auf dem Schlauch. Sorry. Blackout?

mintpc

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bug bei booleschen Operationen?

Beitrag von Mathias »

So, und nun:
writeln (4 or 5) gibt die 4 aus,
writeln (5 or 4) gibt die 5 aus
Dann ist dein PC defekt, bei mir kommen in beiden Fällen eine 5.

Du muss binär denken, dann wirst du es verstehen. 1 or 2 gibt 3.

1 ist 0001
2 ist 0010
0001 or 0010 gibt 0011
0011 ist dezimal 3.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 5174
Registriert: Fr 8. Apr 2011, 09:01

Re: Bug bei booleschen Operationen?

Beitrag von wp_xyz »

das "or" liefert doch true oder false
Nicht unbedingt. OR hat in Pascal eine doppelte Bedeutung, einmal als logische Operation, so wie du es in dem Zitat meinst, und einmal als Bit-Verknüpfungs-Operation, so wie Mathias es beschreibt.

Bei der Zahl 4 ist das Bitmuster 0100, bei 5 ist es 0101. Die Bit-Operation OR setzt im Ergebnis ein Bit, wenn das entsprechende Bit in mindestens einem Operanden gesetzt ist. Die OR-Verknüfung von 0100 und 0101 ist daher 0101, also die Zahl 5.

Das logische OR wird dagegen etwa in folgendem Ausdruck benutzt: if (x=4) or (x=5) then...

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Bug bei booleschen Operationen?

Beitrag von mintpc »

Vielen Dank, jetzt hab ich's gerafft.
Dann ist dein PC defekt, bei mir kommen in beiden Fällen eine 5
Stimmt, hab mich verguckt, sorry.
Du muss binär denken, dann wirst du es verstehen. 1 or 2 gibt 3.
ja, richtig, das ist es. Super.Vielen Dank für die ausführlichen Erklärungen.
Jetzt ist's klar.

minpc

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Bug bei booleschen Operationen?

Beitrag von mschnell »

mintpc hat geschrieben:Aber, wie gesagt, das "or" liefert doch true oder false, was nicht mit einer Zahl verglichen werden kann.
Das ist in Pascal anders als z.B. in C und vielen anderen Sprachen.

In Pascal ist der "or" Operator je nach Typ der Variablen entweder logisch oder Bit-weise-numerisch.

In C gibt es zwei verschiedene Operatoren für bitweise or ("|") oder logisches or ("||").

Deshalb braucht man in C keinen (echten) boolean Typ. "False" ist da einfach 0 und "True" ist 1.

-Michael

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [gelöst] Bug bei booleschen Operationen?

Beitrag von Mathias »

In C gibt es zwei verschiedene Operatoren für bitweise or ("|") oder logisches or ("||").
Da hatte ich auch schon geübt.
Wen ich mich nicht täusche, ist auch die repeat until Schleife verkehrt. Bei Pascal wir die Schleife bei True beendet und bei C und Java mit False.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: [gelöst] Bug bei booleschen Operationen?

Beitrag von m.fuchs »

Mathias hat geschrieben:Wen ich mich nicht täusche, ist auch die repeat until Schleife verkehrt. Bei Pascal wir die Schleife bei True beendet und bei C und Java mit False.
Nö, es gibt dort einfach kein repeat...until. Das do...while reagiert natürlich anders, wie die Schlüsselwörter auch sagen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten