Das hat weniger was mit Wissen zu tun sondern einfach mit der Gefahr von Leichtsinns- und Tippfehlern.
In anderen Sprachen ist ein Vergleich auf Gleichheit eben ein eq
Da gibt’s kaum Verwechslungen.
Das hat aber sehr wohl mit Wissen zu tun. Die Notation
= für Zuweisung und
== für Vergleich ist in den gängigen Programmiersprachen identisch. Den Operator eq kannte ich nicht nicht und ich musste mal googeln. Ich habe ihn in Perl und Lisa gefunden. Und gerade dort hast du dann eq vs eql vs equal mit jeweils völlig unterschiedlicher Bedeutungen (Pointer-Vergleich vs. Typ-sensitiver Vergleich vs. struktureller Vergleich). Da besteht in meinen Augen Verwechselungsgefahr.
Und beim Javascript-Beispiel mit
= vs
== vs
===. Genau das gehört doch zum Basiswissen eines Programmierers, der in JavaScript arbeitet. Und wer unsicher ist oder Profi ist, nutzt ein Tool zur Codeprüfung, dass vor
== warnt und
=== erzwingt. Genau dafür ist statische Codeprüfung doch da.
Tippfehler können bei jedem Aspekt einer Programmiersprache auftreten.. Mit der gleichen Logik müsste man auch myInt++verbieten, weil man es mit myInt-- verwechseln könnte. Oder Einrückungen in Python, die bei Copy-Paste regelmäßig für Bugs sorgen.
Aber genau dafür muss ich doch die Compilermeldungen verstehen oder statische Codeanalyse nutzen. Auch Tools wie UnitTests und Reviews helfen hier - auch wenn dies in der SPS Programmierung noch eine untergeordnete Rolle spielt.
Tipp: wenn eine Codezeile aussieht wie ein unnötiger expliziter Vergleich eines BOOL mit TRUE/FALSE, dann genau hinsehen, ob der Programmierer die logische Verknüpfung nicht besser konnte oder der vermeintliche "Vergleich" = tatsächlich eine Zuweisung := ist!
Exakt. Idealerweise vergleicht man nicht mehr explizit auf auf TRUE/FALSE in der IF-Condition, sondern halt
IF myBool THEN oder
IF NOT myBool THEN. Nur dadurch ist hier das Problem entstanden. Datentyp des nötigen Ergebnisses in der Condition, der Variable und des zugewiesenen Inhalts haben halt hier gepasst. Bei etwas wie
Code:
IF myVar := 5 THEN
// do something
END_IF
hätte der Compiler gemeckert. Entweder, weil man den Wert 5 einer booleschen Variable zuweisen will oder weil im If-Statement kein boolesches Ergebnis steht. Je nach Datentyp von myVar.