"IF" umkehren sinnvoll?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von oobdoo.

    "IF" umkehren sinnvoll?

    Mein VS macht mir den Vorschlag einen IF-Befehl umzukehren (siehe Bild).



    Ich würde vermuten das mein Code durch das > nur eine Auswertung benötigt, der Vorschlag aber zwei Auswertungen notwendig macht, also langsamer ablaufen würde.
    Worin liegt also der Vorteil? Oder mache ich irgendwo einen Denkfehler?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Lass gut sein. Sobald Du die Änderung akzeptiert hast, kommt ein Gegenvorschlag mit einer weiteren If-Umkehr, welches das Ganze wieder in den alten Zustand versetzt.

    Hier ein m.E. sinnvolles Beispiel für eine If-Umkehrung. (Eigenwerbung)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Bei Vergleichen wird bei x86 zuerst die linke Seite in ein Register geladen (sagen wir mal eax), die rechte Seite in ein anderes Register (sagen wir mal ebx) und dann ein CMP-OpCode ausgeführt (wäre dann CMP eax, ebx). Dabei werden die zwei Operanden subtrahiert (und das Ergebnis verworfen) und die Bits im FLAGS-Register entsprechend gesetzt. Zum Beispiel, wenn das Ergebnis 0 war, wird das ZF-Bit auf 1 gesetzt. Bei einem Carry wird das CF-Bit auf 1 gesetzt. Das SF-Bit wird auf den Wert des MSB des Ergebnisses gesetzt. Und so weiter.
    Und dann gibt es lauter verschiedene Sprung-OpCodes, die auf verschiedene Kombinationen dieser Flags prüfen und dann springen, oder eben nicht.
    Nehmen wir folgendes Beispiel:

    VB.NET-Quellcode

    1. If A > B Then
    2. DoIt()
    3. End If
    Die Logik der Sprung-OpCodes ist umgedreht. Der Code muss übersprungen werden, wenn die Bedingung A > B falsch ist. Also effektiv so:

    VB.NET-Quellcode

    1. If Not (A > B) Then Goto Skip
    2. DoIt()
    3. Skip:
    Der verwendete Sprung-OpCode ist hier JNG, also "Jump if not greater than". Der springt, wenn ZF Or SF <> OF. Der gleiche OpCode hat noch einen Namen: JLE, also "Jump if less than or equal". Denn Wenn A nicht größer als B ist, dann ist kleiner oder gleich B.

    Der Vorschlag von Visual Studio macht folgendes:

    VB.NET-Quellcode

    1. If A <= B Then
    2. Continue For
    3. End If
    4. DoIt()
    5. 'Continue For springt hier in
    6. 'Bzw:
    7. If Not (A <= B) Then Goto Skip
    8. Continue For
    9. Skip:
    10. DoIt()
    11. 'Continue For springt hier in
    Hier wird der Sprung-OpCode JNLE, also "Jump if not less than or equal". Der springt, wenn Not (ZF Or SF <> OF).

    Also um auf ein anderes Verhältnis der zu vergleichenden Operanden zu prüfen, werden einfach andere Sprung-OpCodes verwendet. Die dauern alle gleich lang. Sind nur unterschiedliche Kombinationen von Gates im Silizium, die unterschiedliche Kombinationen von Bits im Flags-Register logisch verknüpfen.
    Es wird bei A <= B also nicht (A < B) Or (A = B) "manuell" ausgewertet.


    Der Vorschlag wird von Visual Studio nicht als "Du solltest das so machen", sondern als "So kann man das auch machen" gegeben. Vermutlich, um dir in dem Fall die Schreibarbeit abzunehmen.
    Sinn kann das z.B. in folgendem Fall haben:

    VB.NET-Quellcode

    1. For Each i In Irgendwas
    2. If i Is Nothing Then
    3. Continue For
    4. End If
    5. If i.Foo Is Nothing Then
    6. Continue For
    7. End If
    8. Dim Bar = i.Foo.GetBar()
    9. If Bar Is Nothing Then
    10. Continue For
    11. End If
    12. If Not IsValidBarName(Bar.Name) Then
    13. Continue For
    14. End If
    15. DoSomething(Bar)
    16. Next
    Weil das schöner aussieht als

    VB.NET-Quellcode

    1. For Each i In Irgendwas
    2. If i IsNot Nothing Then
    3. If i.Foo IsNot Nothing Then
    4. Dim Bar = i.Foo.GetBar()
    5. If Bar IsNot Nothing Then
    6. If IsValidBarName(Bar.Name) Then
    7. DoSomething(Bar)
    8. End If
    9. End If
    10. End If
    11. End If
    12. Next
    (Ist natürlich ein gekünsteltes Beispiel, aber man erkennt das Prinzip.)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    ErfinderDesRades schrieb:

    ist das iein Tool, was ich nicht kenne?
    Codeanalyse, ReSharper.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    oobdoo schrieb:

    Mein VS macht mir den Vorschlag einen IF-Befehl umzukehren (siehe Bild).

    wie haste das geschafft?
    Mein VS hat mir noch nie sowas vorgeschlagen - ist das iein Tool, was ich nicht kenne?

    Ich verwende VS 2019 Version 16.4.1 ohne irgendwelche extra Tools.

    Vielleicht erkennt Dich Dein VS als den besseren Programmierer und hat entschieden das Du solche Vorschläge nicht benötigst. :D
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „oobdoo“ ()