Operatoren

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen

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.