Nur ein Symbol !

Zuviel Werbung?
-> Hier kostenlos registrieren
Tatsächlich kann man bei Codesys die := Zuweisung in einem IF-Statement benutzen, wenn man es denn unbedingt besonders stark abkürzen möchte.

In dem Link von Georg ist ja folgendes Beispiel:
Code:
IF b := (i = 1) THEN
  // do something
END_IF

Man könnte es klassischerweise in Langform auch so schreiben:
Code:
b := i = 1;
IF b THEN
  // do something
END_IF
 
Warum verwenden die Codesysser nicht "==" ?
Weil IEC 61131 und damit Codesys ST und Siemens SCL eine von C abweichende Syntax haben.
Codesys und SCL versuchen aber nach und nach ein paar nützliche C-Konstrukte nachträglich einzuarbeiten, und da muss der Programmierer halt auch selber aufpassen, dass er keine ungewollten aber syntaxmäßig korrekte Tippfehler macht.
 
Also, wenn ich es jetzt richtig verstanden habe, dann werden sowohl die Zuweisung, als auch die IF-Abfrage ausgeführt. Dann ist die IF-Abfrage, um die es hier geht, total hirnrissig. Wenn so etwas der Compiler durchlässt, dann kann man das keinesfalls als "funktioniert" bezeichnen. Dann geht der Punkt an Siemens?.
... IF bStart := FALSE THEN ...
 
So tolle Konstrukte hast du auch in Javascipt.
... und in vielen anderen Programmiersprachen, wobei dein Beispiel ja weniger eine Shorthand Notation ist, sondern vielmehr in der fehlenden Typsicherheit von Javascript begründet ist. Gibt ja auch viele andere, einfacher zu lesende, Kurzschreibweisen: myInt++ anstatt myInt = myInt + 1 zum Beispiel. Und hier liegt es einfach an dem Fachwissen des Programmierers sowas auch lesen zu können. Das gilt auch für die Zuweisung in der IF-Condition.

Also, wenn ich es jetzt richtig verstanden habe, dann werden sowohl die Zuweisung, als auch die IF-Abfrage ausgeführt. Dann ist die IF-Abfrage, um die es hier geht, total hirnrissig. Wenn so etwas der Compiler durchlässt, dann kann man das keinesfalls als "funktioniert" bezeichnen. Dann geht der Punkt an Siemens?.
Der Compiler hat damit daraus IF FALSE THEN [...] gemacht. Es ist aber nicht die Aufgabe des Compilers auf sowas hinzuweisen. Das fällt eher in den Bereich der statischen Codeprüfung. Am Ende ist das nichts anderes als eine UND-Bedingung, die bspw. mit einem Nullmerker o. ä. "deaktiviert" wurde. Und sowas ist ja durchaus Alltag für Testzwecke.
 
Es ist im Grunde ganz einfach: Das Ergebnis einer Zuweisung (Left value) kann direkt weiterverwendet werden, z.B.
- für eine weitere Zuweisung b := a := 0;
- für einen Vergleich xresult := (b := a) <> 0;
- für logische Verknüpfung xresult := (b := FALSE) OR (a = 0);

Der Compiler kann nicht wissen, ob solcher Code ein Fehler oder Absicht des Programmierers ist.

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!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Mein persönlicher Klassiker ist ein doppeltes Not... Quasi die doppelte Verneinung 😅
Code:
 If Not Not bMyVar then ...
 
Zurück
Oben