LSL Operators/de

From Second Life Wiki
Jump to: navigation, search

Operatoren sind Zeichen mit denen man Informationen aus Variablen auf vordefinierte Weise verarbeiten lassen kann. Eine (mathematische) Aktion kann auf eine oder zwei Operanden angewendet werden. Ein einfaches Beispiel ist 1 + 2, wobei die Zahlen 1 und 2 die Operanden darstellen, und + ist der Operator.

Operator Beschreibung Anwendungsbeispiel
() Klammern a * (b + c)
[] Eckige Klammern: Listen-Konstruktor [a, 2, "das", 0.01]
(typ) Typkonvertierung nachricht = "Das Ergebnis lautet:" + (string) ergebnis;
 ! ~ ++ -- Logisches-NICHT, Bitweises-NICHT, Inkrement, Dekrement zaehler++;
* / % Multiplikation/Skalarprodukt, Division, Modulo/Kreuzprodukt rest = (anzahl + 1)%5;
- Subtraktion eins = 3 - 2;
+ Addition oder String-Verknüpfung zwei = 1+1;

text = "Hello" + "World";

+ Konkatenation oder Zusammenführung von Listen meineListe = [1, 2, 3] + [4, 5];

neueListe = alteListe + zusatzListe;

<< >> Links Shift, Rechts Shift acht = 4 << 1;
< <= > >= Kleiner Als, Kleiner Als oder Gleich,

Größer Als, Größer Als oder Gleich

istFalsch = (6 <= 4);
==  != Vergleich auf Gleichheit, Vergleich auf Ungleichheit istFalsch = ("dies" == "das");
& Bitweises UND null = 4 & 2;

vier = 4 & 4;

^ Bitweises XOR null = 4 ^ 4;

sechs = 4 ^ 2;

| Bitweises ODER vier = 4 | 4;

sechs = 4 | 2;

|| Logisches ODER istWahr = (FALSE || TRUE);
&& Logisches UND istFalsch = (FALSE && TRUE);
= += -= *= /= %= Zuweisung vier = 4;


Anmerkung: Anders als in den meisten anderen Programmiersprachen die den C-Stil für && und || Operatoren anwenden, werden beide Operanden immer ausgewertet. Zum Beispiel:

<lsl>if (TRUE || 1/0) llSay(PUBLIC_CHANNEL, "Aha!");</lsl>

führt zu einer Fehlermeldung, statt "Aha" auszugeben.

Anmerkung: Die ++ (Inkrement) und -- (Dekrement) - Operatoren wirken sich auf die Zahl entweder vor oder nach der Auswertung aus, je nachdem ob sie vor oder nach dieser Zahl stehen.

<lsl>integer count; if(!(++count)) // Wird erhöht, und danach ausgewertet. llSay(PUBLIC_CHANNEL, "Aha"); // Wird nicht ausgegeben.</lsl>

<lsl>integer count; if(!(count++)) // Wird ausgewertet und danach erhöht. llSay(PUBLIC_CHANNEL, "Aha"); // Wird ausgegeben.</lsl>


Anmerkung: Die Boole'schen Operatoren || und && werden in der Auswertungs-Reihenfolge von LSL als gleichwertig angesehen.

Anmerkung: Die Auswertungsreihenfolge unterscheidet sich von der Auswertungsreihenfolge der meisten Programmiersprachen. Wenn der Wert von x im nachfolgenden Beispiel initial 1 ist, dann werden die zwei Bedingungen unterhalb als FALSCH ausgewertet, und die nächsten beiden als WAHR:

<lsl>(x && (x = 0) == 0 && x)</lsl> <lsl>(x && (x = 0) == 0 && x == 0)</lsl> <lsl>(x == 0 && (x = 0) == 0)</lsl> <lsl>(x == 0 && (x = 0) == 0 && x)</lsl>

Beide Seiten werden ausgewertet, unabhängig davon ob eine der Seiten WAHR ist.


Anmerkung: Gleichheits-Test bei Listen vergleichen nicht deren Inhalte, sondern lediglich deren Länge.

+ Operator

ergebnis = links + rechts

Linker Typ Rechter Typ Ergebnistyp Beschreibung
integer integer integer Addiert links und rechts
integer float float Addiert links und rechts
float integer float Addiert links und rechts
string string string Hängt rechts an das Ende von links an.
list * list Hängt rechts nach dem Ende von links an.
* list list Fügt links vor dem Start von rechts ein.
vector vector vector Addiert links und rechts
rotation rotation rotation Addiert links und rechts
Nicht brauchbar um Rotationen zu kombinieren, stattdessen verwendet man die Operatoren * oder /.

Operator-Abkürzungen

Alternativen zum einfachen '=' Operator...

Einfacher Zuweisungsoperator Operator-Abkürzung (shorthand operator)
a = a + 1 a += 1
a = a – 1 a -= 1
a = a * (n+1) a *= (n+1)
a = a / (n+1) a /= (n+1)
a = a % b a %= b

De Morgansche Regeln

Bitweise Gleichwertigkeiten
UND ODER
~(a & b) ~a | ~b
~a & ~b ~(a | b)
a & ~b ~(~a | b)
~(a & ~b) ~a | b
Boole'sche Gleichwertigkeiten
UND ODER
!(a && b) !a || !b
!a && !b !(a || b)
a && !b !(!a || b)
!(a && !b) !a || b

Nach den De Morganschen Regeln (zeilenweise dargestellt), ist der Code in der UND-Spalte logisch äquivalent zum Code in der ODER-Spalte. a und b müssen nicht zwangsläufig Variablen sein, sondern können auch Ausdrücke sein. In speziellen Fällen kann man diese Gleichwertigkeiten anwenden, um komplexen Code vereinfacht darzustellen. Es ist wichtig diese zwei Tabellen nicht zu verwechseln wenn man sie anwendet. Die ersten beiden Zeilen stellen die De Morganschen Regeln dar wie postuliert, und die letzten beiden Zeilen bauen darauf auf.