If-Abfrage mit mehreren OR funktioniert nicht

  • Hallo...

    Ich verstehe nicht, warum in der ersten If-Abfrage in meinem Beispiel die Abfrage "True" ist und somit die MsgBox startet und wenn ich in der zweiten If-Abfrage noch ein Or Parameter hinzufüge, die Abfrage nicht mehr "True" ist.... der Parameter vor dem Or wurde ja nicht verändert und müsste trotzdem ein "True" ergeben, auch wenn der Parameter nach dem Or "False" ergeben. oder sehe ich das falsch?

    Beispiel:

    Code
    $Aufgabe_auslesen = "Messer"
    $sSource = "bla bla Max Muster bla bla"
    
    If $Aufgabe_auslesen = "Messer" And StringInStr($sSource, "Max Muster") <> 0 Then MsgBox(0,$Aufgabe_auslesen, "geht doch 1" )
    If $Aufgabe_auslesen = "Messer" And StringInStr($sSource, "Max Muster") <> 0 Or $Aufgabe_auslesen = "Teller" And StringInStr($sSource, "Dennis") <> 0 Then MsgBox(0,$Aufgabe_auslesen, "geht doch 2" )

    Gruß

    • Offizieller Beitrag

    Du musst beide Or - Blöcke auch voneinander trennen. Im Moment hast du nur EINE Anweisung, die gemischte And/OR enthält. Wenn du diese nach ihrer Wertigkeit auflöst ist das False.

    So gehts:

    AutoIt
    $Aufgabe_auslesen = "Messer"
    $sSource = "bla bla Max Muster bla bla"
    
    If $Aufgabe_auslesen = "Messer" And StringInStr($sSource, "Max Muster") Then MsgBox(0,$Aufgabe_auslesen, "geht doch 1" )
    If ($Aufgabe_auslesen = "Messer" And StringInStr($sSource, "Max Muster")) Or ($Aufgabe_auslesen = "Teller" And StringInStr($sSource, "Dennis")) Then MsgBox(0,$Aufgabe_auslesen, "geht doch 2" )


    EDIT:

    Falls du mehrmals einen gleichartigen Vergleich vornehmen musst, kann es sich auch lohnen, das in eine Funktion auszulagern. Besser lesbar ist es dann meist auch:

    AutoIt
    $Aufgabe_auslesen = "Messer"
    $sSource = "bla bla Max Muster bla bla"
    
    If _Compare("Messer", "Max Muster") Or _Compare("Teller", "Dennis") Then MsgBox(0, $Aufgabe_auslesen, "geht doch 2")
    
    Func _Compare($p1, $p2)
        Return ($Aufgabe_auslesen = $p1) And StringInStr($sSource, $p2)
    EndFunc
  • ok....

    Ich sehe jetzt den Fehler, verstehe ich aber noch nicht.... Was ändert sich dann an dem Oder durch die Klammern? Oder bedeutet doch, dass entweder das eine ODER das andere True sein muss um um die MsgBox zu starten.... Ohne klammer verhält sich das Or doch wie ein And??? wofür brauch ich das Or dann? :/

    • Offizieller Beitrag

    Ich sehe jetzt den Fehler, verstehe ich aber noch nicht.... Was ändert sich dann an dem Oder durch die Klammern?

    Hier mal deine Befehlszeile, so, wie AutoIt sie Interpretiert (And hat eine höhere Priorität als Or) - s. rote Klammern

    If $Aufgabe_auslesen = "Messer" And StringInStr($sSource, "Max Muster") Or ($Aufgabe_auslesen = "Teller") And StringInStr($sSource, "Dennis")

    Du hast somit ein: If A And B Or C And D

    A & B & D müssen somit wahr sein, damit der gesamte Ausdruck wahr ist. Das Or spielt dadurch keine Rolle

    • Offizieller Beitrag

    Das bedeutet, wenn ich das "Or" nicht mit Klammern von einander trenne, kann ich es auch gleich weg lassen und habe das gleiche Ergebnis?

    Du musst anders vorgehen.

    - 2 Kombinationen von Abfragen bringen ein gültiges Ergebnis, könne also mit Or verknüpft werden

    - da in jeder Kombination ein And verwendet wird ist die Kombination eindeutig durch Klammersetzung abzugrenzen

    Also: "Ereignis AND Person" stellt die Kombination dar.

    Werden mehrere der Kombinationen abgefragt, muss gesichert werden, dass diese nicht falsch verknüpft werden. Dazu einfach die einzelnen Ausdrücke einklammern.

    Das Or kannst du nicht weglassen, wenn es Bestandteil deiner Logik ist. In deinem Fall war die Abfragelogik einfach falsch.

  • Werden mehrere der Kombinationen abgefragt, muss gesichert werden, dass diese nicht falsch verknüpft werden. Dazu einfach die einzelnen Ausdrücke einklammern.

    Allgemein : Das Setzen von Klammern ist unbestritten und dient zudem der Übersichtlichkeit .

    Hier mal deine Befehlszeile, so, wie AutoIt sie Interpretiert (And hat eine höhere Priorität als Or)

    [...]

    Du hast somit ein: If A And B Or C And D

    A & B & D müssen somit wahr sein, damit der gesamte Ausdruck wahr ist.

    Ob And aber (in AutoIt) eine höhere Priorität als Or besitzt, da bin ich mir nicht so sicher.

    Laut Operatoren liegen sie auf der gleichen Prioritätsebene.

    Wenn zwei Operatoren die gleiche Priorität besitzen, wird der Ausdruck von links nach rechts ausgewertet.

    AutoIt
    Local $bA, $bB, $bC, $bD
    $bA = True
    $bB = False
    $bC = True
    $bD = True
    If $bA And $bB Or $bC And $bD Then
        MsgBox(BitOR(4096, 64), "Ergebnis", "1. Vergleich = TRUE")
    Else
        MsgBox(BitOR(4096, 64), "Ergebnis", "1. Vergleich = FALSE")
    EndIf

    Hätte And eine höhere Priorität, dann müsste hier FALSE herauskommen.

    Da ich solche Konstrukte aber seit Urzeiten auch immer in Klammern setze, mag ich hier durchaus falsch liegen ;).

    (in z.B. Pascal hat And eine höhere Priorität als Or, bei AutoIt aber offenbar nicht)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (20. Juni 2020 um 13:52)

  • Ob And aber (in AutoIt) eine höhere Priorität als Or besitzt, da bin ich mir nicht so sicher.

    Laut Operatoren liegen sie auf der gleichen Prioritätsebene.

    And und Or haben also dieselbe Priorität...

    ist es also zu betrachten wie in der Mathematik Punkt vor Strich Klammer zuerst? In diesem Fall And vor Or Klammer zuerst?

    Ja, genau wie in der Mathematik... nur musst du in AutoIt die Regeln beachten, die für die Operatoren festgelegt wurden und mit runden Klammern kannst du erzwingen, dass die darin enthaltenen Ausdrücke vorrangig ausgewertet werden.

    Einmal editiert, zuletzt von Bitnugger (20. Juni 2020 um 15:38)

  • Wenn zwei Operatoren die gleiche Priorität besitzen, wird der Ausdruck von links nach rechts ausgewertet.

    Bestätigt. :P

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • ist es also zu betrachten wie in der Mathematik Punkt vor Strich Klammer zuerst? In diesem Fall And vor Or, Klammer zuerst?

    Die Fett markierte Aussage ist verkehrt. Wie Bitnugger bereits schrieb: And & Or haben die gleiche Priorität, sind also gleichwertig (wie z.B. + und -).

    Generell hat das mit der Mathematik gar nicht mal so viel zu tun, sondern mit reiner Logik. Du Schachtelst ja auch beim sprechen Aussagen:

    Beispiel:

    Ich möchte ein Brot mit Wurst oder ein Brötchen mit Käse. => Ich möchte ein (Brot mit Wurst) oder (ein Brötchen mit Käse).

    Das "mit" ersetzt hierbei das "and" und das "oder" das "or". Logisch wäre das also:

    AutoIt
    If ($Brot and $Wurst) or ($Broetchen and $Kaese) then MsgBox(BitOR(4096, 64), "Ergebnis", "Ich bin glücklich")

    Ohne die Klammern würde die Maschine das so verstehen:

    AutoIt
    If $Brot and $Wurst or $Broetchen and $Kaese then MsgBox(BitOR(4096, 64), "Ergebnis", "Ich habe Brot, Wurst und Käse und VIELLEICHT habe ich auch ein Brötchen.")

    Dieser Zusammenhang ist einem als menschlicher Leser (auf Grund der Zusammenhänge) klar, eine Maschine jedoch kann so etwas nicht wissen und muss ihr durch/mit den Klammern gezeigt werden.

    5 Mal editiert, zuletzt von Moombas (22. Juni 2020 um 10:20)