Gegenteil von IF

  • If $beispiel=1 then
    $beispiel2
    endif

    gibt es eine funktion wie
    wenn beispiel NICHT 1 ist dann $beispiel3?

  • Es gibt auch noch "if not", was aber natürlich "ist ungleich" aus blubbstars Beispiel entspricht.
    In deinem Beispiel könntest du natürlich auch noch ein else verwenden für alle Fälle die eben nicht 1 sind.

  • Hi,
    da ein Prozessor (Computer) landläufig nur zwischen 0 und 1 unterscheiden kann, hat sich das auch in den Programmiersprachen durchgesetzt.
    Sämtliche Fallunterscheidungen(IF,SELECT,SWITCH, und natürlich auch GLEICH = oder UNGLEICH <>, GRÖSSER > oder KLEINER <) orientieren sich somit an 0 oder 1, genau wie die Abbruchbedingungen von Schleifen (WHILE, DO) und noch viel mehr, z.B. Berechnungen. Bei irgendwelchen Abfragen wird IMMER NUR auf 0 oder 1 getestet!

    Da Prozessorintern auch nur mit 0 und 1 gerechnet wird, übrigens per simpelsten Bausteinen wie AND-, OR-, XOR-, und NAND-Gattern kann man auch die 0en und 1en entsprechend "umrechnen".
    Eine 1 an den Eingang eines NOT-Gatter angelegt, ergibt am Ausgang eine 0 und umgekehrt. Die Computersprache orientiert sich IMMER an der Hardware (an was sonst^^) und macht demnach aus einem NOT 1 eine 0...
    Da aber die "Computer-Hochsprachler" sich zu fein waren, sich mit schnöden Nullen und Einsen zu befassen, ersetzten sie 1 mit TRUE und 0 mit FALSE. (Wahr und nicht wahr). Wenn man also einen Ausdruck mit WAHR bezeichnet, dann entspricht das 1, bei UNWAHR dementsprechend 0. NOT TRUE entspricht FALSE und umgekehrt.

    *whisper an die Insider* deshalb bin ich gespannt wie ein Flitzebogen auf die Programmiersprachen eines Quantencomputers *whisper out*

    Und somit ergeben sich die Fallunterscheidungen....
    Beispiel:

    [autoit]

    If 1 Then MsgBox(0, "Info", "If-Abfrage hatte Ergebnis 1=True")
    If True Then MsgBox(0, "Info", "If-Abfrage hatte Ergebnis True=1")
    If 0 Then MsgBox(0, "Info", "Coole Programmiersprache!") ; wenn man diese MsgBox sieht, wirds bitter...
    If Not 0 Then MsgBox(0, "Info", "NOT 0 macht der Prozessor zu 1, und dann stimmts!");
    If Not False Then MsgBox(0, "Info", "NOT FALSE macht die Programmiersprache zu TRUE und der Prozessor zu 1, und dann stimmts!"); exit

    [/autoit][autoit]

    While 1 ;solange hier 1 oder TRUE steht, läuft die Schleife weiter
    wend

    [/autoit][autoit][/autoit][autoit]

    While NOT FALSE ;läuft ebenso endlos
    wend

    [/autoit]

    Da GLEICH natürlich auch nur eine Fallunterscheidung ist, gilt dasselbe. Da GLEICH aber auch gleichzeitig (sic) eine Wertzuweisung ist, gibt es ab und zu Stolpersteine!
    Einige Programmiersprachen lassen die Wertzuweisung innerhalb einer Fallunterscheidung zu....was sicherlich dem erhöhten Drogenkonsum in den 70er und 80er Jahren geschuldet ist^^. Glücklicherweise gehört AutoIt nicht dazu!

    [autoit]

    $a = Not False ;Wertzuweisung, der Inhalt von $a ist TRUE
    If $a Then MsgBox(0, "Info", "Abfrage auf TRUE erfolgt!")

    [/autoit][autoit][/autoit][autoit]

    $a = 53 ;Wertzuweisung, der Inhalt der Variable $a ist 53
    MsgBox(0, "Ergebnis $a=53 ist:", $a = 53) ;Hier ist das Gleich = eine WAHR/UNWAHR-Unterscheidung, also TRUE!
    MsgBox(0, "Ergebnis $a=24 ist:", $a = 24) ;Hier ist das Gleich = eine WAHR/UNWAHR-Unterscheidung, also FALSE!

    [/autoit][autoit][/autoit][autoit]

    $a=4 ;Wertzuweisung, Variable $a erhält den Wert 4
    ;in der folgenden Zeile ist das = eine Fallunterscheidung TRUE/FALSE
    if $a=4 then Msgbox(0,"Ergebnis","Der Inhalt der Variablen $a ist gleich 4, daher ist das Ergebnis TRUE, und man sieht die Messagebox!")
    if $a>0 then Msgbox(0,"Ergebnis","Der Inhalt der Variablen $a ist grösser als 0, daher ist das Ergebnis TRUE, und man sieht die Messagebox!")

    [/autoit]

    Wer aufgepasst hat, konnte vielleicht erkennen, dass ein "IF TRUE THEN" nur ein TRUE ist, und dieses wiederum mit dem Ergebnis eines Vergleichs ($a=4) übereinstimmt! Man kann also völlig auf IF verzichten!

    [autoit]

    $a = 4 ;Wertzuweisung
    If ($a = 4) Then ;wenn Klammerausdruck wahr, dann
    $ergebnis = 50 ;ergebnis auswählen
    Else ;ansonsten
    $ergebnis = 60
    EndIf
    MsgBox(0, "ergebnis=", $ergebnis)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;Das IF/ELSE Konstrukt kann man durch eine Zeile ersetzen
    $ergebnis = ($a = 4) * 50 + ($a <> 4) * 60 ;wenn ($a=4) TRUE ist, dann entspricht das 1, und 1*50 ist 50....dann ist ($a<>4) aber 0, und 0*60 ist 60...und umgekehrt
    MsgBox(0, "ergebnis=", $ergebnis)

    [/autoit][autoit][/autoit][autoit]

    ;oder gekürzt
    $ergebnis = 60 - ($a = 4) * 10 ;60 minus TRUE(=1) *10 ist 50, und 60 minus FALSE(=0)*10 ist 60
    MsgBox(0, "ergebnis=", $ergebnis)

    [/autoit]


    Ich habe keine Ahnung, welche Berechnung (IF oder der Einzeiler) schneller oder langsamer ist, aber eins ist klar, einige dieser Zeilen in ein Script eingestreut ersparen einen Obfuscator definitiv.
    Man kann natürlich mehrere ineinandergeschachtelte IF-Abfragen in eine einzige Zeile packen! Wenn es schon den Code nicht lesbarer macht, dann erfordert es wenigstens etwas Gehirnschmalz beim Leser, und führt zum einen oder anderen "OHA"-Effekt :D

    Ich hoffe, nun alle Klarheiten bezüglich IF/THEN, TRUE/FALSE und 1/0 restlos beseitigt zu haben :P

    Somit sollte auch die Verwendung von BITAND, BITOR oder BITXOR möglich werden, denn mit Nullen und Einsen kennt man sich ja nun aus :thumbup:

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (19. Februar 2011 um 08:47)

  • Nach diesem sehr ausführlichen Beitrag bring ich noch ein Beispiel für Funcs, da kann man True und False auch nutzen.

    [autoit]

    If _truefunc(1) Then MsgBox(0, "True", "Die Funktion ist True.")

    [/autoit][autoit][/autoit][autoit]

    Func _truefunc($i)

    [/autoit][autoit][/autoit][autoit]

    ;;>> Mit Switch-EndSwitch
    Switch $i
    Case 1
    Return True
    EndSwitch
    Return False

    [/autoit][autoit][/autoit][autoit]

    ;;>> Mit If-Endif
    If $i = 1 Then Return True
    Return False

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    EndFunc ;==>_truefunc

    [/autoit]

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Sehr nette und ausführliche Zusammenfassung, auch wenns wohl eher zur allgemeinen Verwirrung beiträgt. ^^

    Selbst verzichte ich am liebsten auf "if not" Konstrukte. Ist irgendwie für mich wesentlich besser nachvollziehbar wenn immer das selbe Schema mit den Operatoren = oder <> zum Einsatz kommt. Lustig sind doppelte Verneinungen a la if not ($a <> 1) womit man den Quellcode in der Tat sehr schwer nachvollziehbar machen kann. Wenn dann noch AND und OR mit in die if Bedingung wandern wirds grausig.

    Im Zweifelsfall immer ein paar mehr Zeilen als irgendwelche verschachtelten und schwer verständlichen Konstrukte. Macht man sich selbst das Leben deutlich einfacher, insbesondere wenn man nach Monaten mal wieder eine Änderung am Programm vornehmen muss.

    PS: Variablen mit $true und $false zu benennen macht auch Spass :D