Seite 3 von 4

Verfasst: 10.12.2004 18:08
von Danilo
freedimension hat geschrieben:Manchmal kann überzeugen echt schwer sein :)
OK, dann halte ich mich raus.

Ich würde Dir 2 Schritte empfehlen um Gewissheit zu bekommen:
1.) ASM-Code davon checken
2.) Mit Fred darüber reden (am besten im Chat, privat und in Ruhe)

Ich nehme mal an das Fred Dir das Gleiche sagt wie ich,
daß es bisher so angedacht war von links nach rechts zu
prüfen, und sobald etwas nicht wahr ist springt es raus.
Du kannst ihm dann selbst Lösungen aufzeigen und ihn
überzeugen. Oder es in die Referenz schreiben, und die
Sache somit klarstellen (links nach rechts; Klammern für
Eindeutigkeit verwenden).

Verfasst: 10.12.2004 18:42
von MARTIN
Narmalerweise hat "AND" Vorrang vor "OR".
Sollte das in PB anders sein muss das geändert werden.

Verfasst: 10.12.2004 18:45
von Kaeru Gaman
das ist der mann der alles zweimal sagt. zweimal sagt.

warum sollte AND vorrang haben?
wer sagt das? wo steht das?
mit welcher begründung?

[edit]
in der help steht kein hinweis auf eine unterschiedliche wertigkeit
der beiden logischen verknüpfungen.
in meiner mathe-formelsammlung auch nicht.

> ...muss das geändert werden.

finde ich da ne echt anmassende aussage :?

Verfasst: 10.12.2004 18:51
von freedimension

Code: Alles auswählen

a = 0
b = 0
c = 1
If a And b Or c
  d = 42
EndIf
ergibt

Code: Alles auswählen

; a = 0
  MOV    dword [v_a],0
; b = 0
  MOV    dword [v_b],0
; c = 1
  MOV    dword [v_c],1
; If a And b Or c
  CMP    dword [v_a],0
  JE    _AO_No0
  CMP    dword [v_b],0
  JE    _AO_No0
  CMP    dword [v_c],0
  JNE   _AO_Ok0
  JMP   _AO_No0
_AO_Ok0:
  MOV    eax,1
  JMP   _AO0
_AO_No0:
  XOR    eax,eax
_AO0:
  AND    eax,eax
  JE    _EndIf2
; d = 42
  MOV    dword [v_d],42
; EndIf
_EndIf2:
(habe IMHO unwichtigen Code weggelassen)

Verfasst: 10.12.2004 19:20
von helpy
MARTIN hat geschrieben:Narmalerweise hat "AND" Vorrang vor "OR".
Sollte das in PB anders sein muss das geändert werden.
Es ist eindeutig anders in PB!

[ GELOESCHT ... nicht relevant, da PB anders funktioniert ]

Die Logik von PB scheint mir nicht ganz nachvollziehbar zu sein.

cu, helpy

Verfasst: 10.12.2004 19:58
von Exabot
@ Danilo

wenn Du recht hättest, müsste dann nicht der umgekehrte Fall, also:
1 and 1 or 0
nicht True ergeben ?

Code: Alles auswählen

Debug 1 and 1 or 0 ; Ergebnis 0 ?
(Bis eben wahr ich geneigt Dir zuzustimmen, jetzt verteh ich aber gar nicht mehr :? )

mfg
Spider

-----------
PB has no brain, use yur own!!

Verfasst: 10.12.2004 20:03
von PMV
Ob PB das so wie in C macht, beim ersten Falschen Ergebnis raus springt, oder ob das nicht so ist ...

^^das sollte unabhängig davon, ob Fred das "fixt" (verändert) oder so lässt in die PB Hilfe geschrieben werden ...

Damit zum einen auch Neulinge wissen, wie PB das hand habt und zum anderen, damit auch alle anderen sofort wissen, wie das ganze Funktionieren soll. (Damit wäre so eine Diskusion nie nötig gewesen :wink: ) ... aber Interezant isse alle mal, bin mal gespannt, was Fred dazu sagt.

Aber Andre ... bitte in die Hilfe schreiben :D ... mir ist nen problem mit den If's schon früh aufgefallen ... jetzt weis ich endlich den grund :o *gg*

Und ... wenn Fred das nicht als Bug ausgibt und PB wirklich bei dem ersten False die Abfrage abbricht, wäre ich dafür, es so zu lassen ... so kann man nämlich mehrere Abfragen eine machen, wo die 2, 3 usw. nicht abgefragt werden darf, wenn die davor Falsch ist :D ... sonnst musst man immer ne neue Abfrage machen. (ich mag nicht so gern viele If-Abfragen zu machen, lieber ne "längere" Zeile :D )

MFG PMV

Verfasst: 10.12.2004 20:50
von helpy
Spider hat geschrieben:@ Danilo

wenn Du recht hättest, müsste dann nicht der umgekehrte Fall, also:
1 and 1 or 0
nicht True ergeben ?

Code: Alles auswählen

Debug 1 and 1 or 0 ; Ergebnis 0 ?
Das ist aber nun wirklich ein Bug ... egal wie man es sieht

Verfasst: 10.12.2004 21:25
von MARTIN
Bei mir ergibt das:

Code: Alles auswählen

If (1 and 1 or 0 and 0);oder (0 and 0 or 1 and 1)
  printN("Wahr")
Else
  printN("Falsch")   
EndIf
ergibt:"Falsch"
So als würden die operatoren von links nach rechts ausgewertet.
Aber dann müsste das beispiel von Spider:

Code: Alles auswählen

If (1 and 1 or 0)
  printN("Wahr")
Else
  printN("Falsch")   
EndIf
"Wahr" ergeben.Tut es aber nicht.

Das aber (mit dem gcc compilert):

Code: Alles auswählen

#include <iostream>
using namespace std;
int main()
{
  if(1 && 1 || 0 && 0) //oder (1 && 1 || 0) oder (0 && 0 || 1 && 1)
  {
     cout << "Wahr" << endl;
  }
  else
  {
     cout << "Falsch" << endl;
  }
  
  return 0;
}
ergibt:"Wahr"

Es gibt also eine kleine inkonsistenz was logische operatoren angeht.
> ...muss das geändert werden.

finde ich da ne echt anmassende aussage
ok ok war nur n Vorschlag, ich bestehe gar nicht darauf, aber warum nicht einfach rang der operatoren so wie in C/C++ setzten ?
Also "AND" vor "OR".

Verfasst: 10.12.2004 21:39
von Exabot
@ MARTIN

wenn ich Dein C-Beispiel nachvollziehe kommt And (&&) nicht
vor Or (||) sondern es wird der gesamte Ausdruck korrekt von
links nach rechts ausgewertet, ohne beim 1. False (0 && 0) abzubrechen.

Wenn ich mein 2. Beispiel ( 1 and 1 or 0 ) hernehme, stelle ich fest,
dass PB wohl auf gleicher Ebene (also ohne Klammern) nur 1 and oder or
korrekt auswertet.

Lösung: Wie seither auch - und von Danilo vorgeschlagen - () verwenden!

Gruss
Spider