Operatoren
Allgemeines
Unter Operatoren versteht man spezielle Zeichen, die angeben, wie mit Werten bzw. Variablen verfahren werden soll.
Arten der Operatoren
Zuweisungs-Operatoren
direkte Zuweisungs-Operatoren
Der klassische Zuweisungsoperator ist das
=
Da das Gleichheitszeichen aber auch zu den Vergleichs-Operatoren gehört, sollte man zur besseren Lesbarkeit des Codes den Zuweisungs-Operator
:=
verwenden werden.
Der Zuweisungs-Operator kann auch mit mathematischen Operatoren verknüpft werden:
nTag *= 365
und erlaubt eine verkürzte Schreibweise. In Langform sieht das obige Beispiel so aus:
nTag := nTag * 365
Besonderheiten
lValue
Der Begriff auf der linken Seite des Zuweisungs-Operators wird lValue genannt. Der Begriff lValue taucht bei bestimmten Fehlern im Programm-Code auf:
date() := time()
Eine derartige Zuweisung resultiert dann in dieser Fehlermeldung:
LTEST.PRG(5:0): error XBT0231: Invalid lvalue
Daraus folgt: der Wert auf der linken Seite des Zuweisungsoperators muss eine Variable sein. Wobei, wie üblich, festgestellt werden muss, dass der Compiler bestimmte lValue-Fehler nicht erkennen kann, da sie erst zur Laufzeit erkannt werden können:
CLASS Test PROTECTED: VAR Eins ... oTest := Test():new() oTest:Eins := 2
Auch hier ist oTest:Eins ein ungültiger lValue, da es sich um eine geschützte Variable handelt, die nur bei Zuweisungen innerhalb der Klasse verändert werden kann. Dieser Zusammenhang kann jedoch immer erst bei der Laufzeit erkannt werden.
verknüpfte Zuweisungsoperatoren
Bestimmte mathematische Operatoren können auch mit dem Zuweisungsoperator kombiniert werden:
+ Addition / Stringverknüpfung - Subtraktion / Stringverknüpfung * Multiplikation / Divison % Modulo ** Exponent ^ Exponent
Bei einer Anwendung auf Variablen mit numerischem Inhalt ist das Ergebnis absehbar. Die beiden Operatoren + und - können auch auf Strings angewendet werden:
+= verknüpft die Strings, incl. nachfolgender Blanks bei der links stehenden Variablen -= verknüpft die Strings, wobei nachfolgende Blanks bei der links stehenden Variablen entfernt werden
indirekte Zuweisungs-Operatoren
Die Sprache lässt auch eine indirekte Zuweisung zu. Eine Funktion liefert ein Ergebnis zurück. Werden jedoch mehrere Ergebnisse aus einer Funktion benötigt, kann die Funktion entweder ein Array mit den Ergebnissen zurückgeben, oder bestimmte Parameter werden by reference übergeben:
nErgebnis := BerechneWas(nWert1, nWert2, @nSteuer, @nBestand)
Die Variablen nSteuer und nBestand werden by reference übergeben, während die Variablen nWert1 und nWert2 by value übergeben werden.
Eine Übergabe by Value übergibt eine Kopie des Variablen-Inhalts, während eine Übergabe by reference eine Referenz auf die Variable übergibt, d.h. die aufgerufene Funktion kann den Inhalt der Variablen verändern.
Arrays und Objekte werden by reference übergeben.
In unserem Beispiel kann die Funktion BerechneWas() den beiden Variablen nSteuer und nBestand neue Werte zuweisen.
Vergleichs-Operatoren
Ein Vergleichsoperator vergleicht zwei Variablen miteinander und liefert entweder TRUE oder FALSE als Ergebnis zurück.
'A' > 'B' => FALSE
Es werden die bekannten mathematischen Vergleichs-Operatoren unterstützt:
= > < >= <=
Als weiteren Vergleichs-Operator gibt es noch
==
Hiermit wird auf vollständige Gleichheit verglichen, auch in Abhängig von SET EXACT bzw. SET LEXICAL. Wenn zwei Strings mit = verglichen werden, endet der Vergleich mit dem Ende des Strings auf der rechten Seite des Vergleichs-Operators. Tritt bis zu dieser Stelle keine Abweichung auf, werden beide Strings als gleich angesehen:
cEins := "abcdefg" cZwei := "abcdef" cEins = cZwei => TRUE cZwei = cEins => FALSE cEins == cZwei => FALSE
Der Vergleich cEins = cZwei vergleicht nur die ersten sechs Zeichen von cEins mit cZwei, da cZwei nur eine Länge von sechs Zeichen hat. Da die ersten sechs Byte in beiden Variablen identisch sind, liefert der Verleich ein TRUE.
Der Vergleich cZwei = cEins vergleicht neben den ersten sechs Zeichen auch das siebte Zeichen von cEins, das in cEins nicht mehr vorhanden ist. Daher ist dieser Vergleich FALSE.
Der Vergleich cEins == cZwei erzwingt einen Vergleich beider Strings in der vollständigen Länge beider Strings und liefert daher ebenfalls FALSE.
Für den Einsatz des einfachen Vergleichs gelten folgende Regeln:
ist cZwei (der Wert auf der rechten Seite) ein leerer String, ergibt der Vergleich TRUE ist cZwei länger als cEins, werden nur die Zeichen von cEins mit den korrespondieren Stellen von cZwei verglichen
mathematische Operatoren
Zeichen-Operatoren
Alias-Operator
Datei-Funktionen beziehen sich normalerweise auf die Datei in der aktuellen (aktiven) Workarea. Um auf andere Workareas zuzugreifen, wird der Alias-Operator
->
verwendet.
Der Alias-Operator kennt zwei unterschiedliche Formen:
Kunden->Ort Kunden->(Recno())
Wird auf ein Feld der Workarea zugegriffen, wird der Name der Workarea über den Alias-Operator mit dem Feldnamen verknüpft. Wird auf eine Datei-Funktion zugegriffen, muss der Begriff hinter dem Alias-Operator in runde Klammern gesetzt werden.