Im einfachsten Fall kann ein Ausdruck also aus nur einer Konstanten bestehen, im komplexesten aus
mehreren geschachtelten Ausdrücken. Die Schachtelungstiefe hängt auch von der Anzahl der GOSUBs und
FOR NEXT Schleifen ab (s. Stack).
Bei der Behandlung der einzelnen BASIC Befehle werden die Parameter nur durch die Art des Ausdrucks
definiert. Es wird nicht jedesmal erwähnt, dass ein Ausdruck beliebig einfach (Konstante) oder sehr
komplex sein kann. Anders ausgedrückt dürfen nur BASIC Zeilennummern nur als Konstante auftreten
(z.B. LIST 10 - 20), während alle anderen Parameter von Befehlen allgemeine Ausdrücke des jeweiligen Typs sind!
4.1 Numerische Ausdrücke und Operatoren
Numerische Operatoren
Operation
Operator
Beispiel
Potenz
h (Pfeil n. oben)
X h Y
Negation (unäres Minus)
-
-X , A*(-3)
Multiplikation
*
X*Y
Division
/
X/Y
Addition
+
X+Y
Subtraktion
-
X-Y
Entsprechend der mathematischen Definition bindet die Potenzierung stärker als die Multiplikation/Division
und diese stärker als Addition/Subtraktion. Innerhalb der gleichen Hierarchiestufe werden Ausdrücke von
links nach rechts ausgewertet. Durch Klammern können die Standard-Hierarchien durchbrochen werden.
Beispiel:
Ausdruck
Zwischen-Ergebn.
Erläuterung
2+3 *5
= 2+15 = 17
'Punkt vor Strich'
(2+3)*5
= 5*5 = 25
Klammern binden am stärksten
2 h 3*2
= 8*2 = 16
Exponentiation bindet stärker als Multiplikation
2 h (3*2)
= 2h6 = 64
Klammern binden stärker als Exponentiation
2 h -3
= .125
2h-3 = 1/(2h3)
2 h (-3)
= .125
überflüssige Klammern schaden nicht
-2 h 3
= -8
-2h3 = (-2)*(-2)*(-2)
-2 h -3
= -.125
-2h-3= (-0.5)*(-0.5)*(-0.5)
-2*3
= -6
minus mal plus ergibt minus
-2*-3
= 6
minus mal minus ergibt plus
--2*3
= 6
--2 = (-1)*(-2)
Maximal kann ein Ausdruck 9 Klammerebenen enthalten. Wird diese Anzahl überschritten, wird OUT OF MEMORY ERROR
gemeldet.
Näheres ist unter Stack beschrieben. Abhilfe kann leicht geschaffen werden, indem der Ausdruck in mehrere
Teilausdrücke zerlegt wird, deren Ergebnisse in mehreren Variablen zwischengespeichert werden. Im nächsten
Schritt werden dann diese Variablen in der gewünschten Weise verknüpft. Natürlich kann diese Unterteilung
in beliebig viele Teilschritte erfolgen. Dieser Methode sind keine Grenzen gesetzt:
Beispiel
A = (B+C) * (D+E)
kann ersetzt werden durch:
Z1= B+C
Z2= D+E
A = Zl. * Z2
Die Fehlermeldungen OVERFLOW ERROR und ILLEGAL QUANTITY ERROR sind bei den Datenarten beschrieben. Wird versucht,
durch 0 zu dividieren, so wird DIVISION BY ZERO ERROR gemeldet.
4.2 Logische Ausdrücke und Operatoren
Der Computer kann zwei numerische oder String-Ausdrücke vergleichen, um festzustellen, ob sie gleich bzw.
ungleich sind, oder ob einer größer oder kleiner als der andere ist.
Mehrere solcher Entscheidungsergebnisse kann er durch die logischen Operatoren NOT, AND und OR verknüpfen.
Auf diese Weise können sehr komplexe Entscheidungen getroffen werden, die mit Hilfe von
IF (logischer Ausdruck) THEN
den Programmablauf beeinflussen können. Dies ist bei IF THEN beschrieben.
Darüber hinaus kann aber das Ergebnis einer logischen Entscheidung auch in Variablen zur späteren Verwendung
aufbewahrt werden.
Ehe aber diese Feinheiten betrachtet werden, sollen die 3 Vergleichs-Operatoren mit ihren 6
Kombinationsmöglichkeiten vorgestellt werden:
Das Symbol für
kleiner als
ist
spitze Klammer auf,
und für
größer als
ist
spitze Klammer zu.
Aus technischen Gründen können diese Symbole hier im Text nicht dargestellt werden, und werden deshalb durch k
(kleiner als) bzw. g (größer als) ersetzt.
4.2.1 Vergleichsoperatoren
Operator
Bedeutung
Beispiel
Bedeutung:
ist der Inhalt der Variablen A
=
gleich
A = 3
identisch mit dem Wert 3
g
größer als
A g 3
größer als 3
k
kleiner als
A k 3
kleiner als 3
=k oder k=
kleiner/gleich
A =k 3
kleiner oder gleich 3
=g Oder g=
größer/gleich
A g= 3
größer oder gleich 3
gk oder kg
ungleich
A gk 3
ungleich 3 (größer oder kleiner als 3)
Bei Zahlen ist die Bedeutung dieser Entscheidung offensichtlich. Die Anwendung auf Strings bedarf aber
einer Erklärung:
4.2.2 Vergleich von Strings
'=' stellt fest, ob die Ergebnisse beider Stringausdrücke identisch sind, ob die Strings also in allen
Zeichen übereinstimmen.
'gk' stellt fest, ob die Strings nicht in allen Zeichen übereinstimmen. Anders ausgedrückt, wird hier
mit 'wahr' geantwortet, wenn mindestens ein Zeichen verschieden ist.
'g' bzw. 'k' prüft die alphabetische Reihenfolge. Ist ein String 'kleiner' als der andere, so steht er
im Alphabet weiter vorne.
Einige Beispiele sollen diesen leistungsfähigen Vergleich verdeutlichen. Die angegebenen Vergleiche
erzeugen eine wahre Aussage:
1) "ABC" = "ABC"
2) "ABC" gk "ABX"
3) "ABC" k "BCD"
4) "ABC" k "BC"
5) "ABC" g "AB"
Allgemein wird der ASC Code der 1., 2., 3. usw. Zeichen beider Strings verglichen:
Solange die Codes identisch sind, werden die Strings als gleich bezeichnet (1).
Wird an einer Stelle ein Unterschied festgestellt, wird abgebrochen und das Ergebnis lautet 'ungleich' (2).
Falls kleiner oder größer gefragt war, wird ebenfalls anhand der ersten Ungleichheit entschieden, was zutrifft (3).
Grundsätzlich wird also nur bis zur ersten Ungleichheit verglichen! Ein Sonderfall wird durch diese
Definition ebenfalls erklärt: Wenn ein String zu Ende ist, aber beide so weit identisch waren, so ist
der kürzere der kleinere, weil das leere Stringelement (für das es keinen ASC Code gibt!) als kleiner
definiert ist, als jeder andere ASC Code! (5)
Wie Beispiel (4) zeigt, ist nicht die Länge der Strings ausschlaggebend. Ein längerer String kann im
Alphabet durchaus weiter vorne stehen, also 'kleiner' sein als ein kürzerer!
4.2.3 Wahr und falsch
Wenn nur innerhalb von IF ... THEN Entscheidungen getroffen werden, genügt es zu wissen, dass 'wahr' den
Programmlauf hinter THEN fortsetzt, 'falsch' dagegen in der nächsten BASIC Zeile (s. IF THEN).
Für kompliziertere Entscheidungen ist es hilfreich zu wissen, wie der Computer die Werte 'wahr' und 'falsch'
darstellt. Im Gegensatz zu anderen Computersprachen kennt BASIC keine speziellen logischen (boolean) Werte und
Variable, sondern stellt diese beiden Werte durch Integer-Zahlen dar:
Das Ergebnis eines logischen Ausdrucks ist
0 für 'falsch' (false nein)
und
-1 für wahr' true ja
Beispiel:
? 5 g 3 -1
Fünf ist größer als 3 ist eine wahre Aussage.
? 3 g 5 0
Drei ist größer als 5 ist eine falsche Aussage.
A = 5 g 3 ? A -1
Das Ergebnis des logischen Ausdrucks kann in eine Zahlenvariable übernommen werden.
Intern wird ein logischer Wert wie jede Integer Zahl als 16-Bit-Zahl dargestellt. Bei '-1' sind alle Bits
gesetzt, bei '0' entsprechend alle gelöscht.
4.2.4 Verknüpfung von logischen Ausdrücken durch NOT, AND und OR
NOT, AND und OR führen im Grunde bitweise logische Verknüpfungen mit zwei 16-Bit-Zahlen durch.
Dies ist aber nicht wichtig zu wissen, wenn man nur logische Ausdrücke verknüpfen will. Für
diesen Fall kann man diese drei Operatoren leicht verständlich definieren:
Werden zwei logische Ausdrücke durch AND verknüpft, so ist das Ergebnis genau dann 'wahr' (-1), wenn
beide Ausdrücke 'wahr' sind.
Bei OR ist das Ergebnis schon dann 'wahr', wenn wenigstens einer der beiden Ausdrücke 'wahr' ist.
NOT verknüpft nicht zwei Ausdrücke, sondern ist ähnlich wie das arithmetische Vorzeichen (unäres Minus)
einem logischen Ausdruck vorangestellt und kehrt seinen Wert ins Gegenteil um.
In der folgenden Tabelle sind alle Kombinationsmöglichkeiten nochmal zusammengestellt.
Verknüpfung
Ergebnis
falsch AND f alsch
falsch
falsch AND wahr
falsch
wahr AND falsch
falsch
wahr AND wahr
wahr
falsch OR falsch
falsch
falsch OR wahr
wahr
wahr OR falsch
wahr
wahr OR wahr
wahr
NOT wahr
falsch
NOT falsch
wahr
Ergänzende Informationen zu den logischen Ausdrücken sind bei IF THEN, NOT, AND, OR und WAIT zu finden.
4.2.5 Hierarchie
Bei der Auswertung von logischen Ausdrücken bzw. von Zahlenausdrücken gelten gewisse
Hierarchiestufen oder Bindungsregeln. In der folgenden Tabelle sind nochmal alle Operatoren
geordnet von der stärksten zur schwächsten Bindung aufgeführt:
Mathematische Operatoren
Funktionen
(SIN, FN, EXP usw)
-
(Vorzeichen, unäres Minus)
h
(Exponentiation)
* /
+ -
Vergleichsoperatoren
= g k (alle Vergleichsoperatoren sind gleichberechtigt)
Logische Operatoren
NOT
AND
OR
Diese Hierarchien werden vom Computer sehr konsequent eingehalten. Da solche Strukturen erfahrungsgemäß
Vorstellungsschwierigkeiten bereiten, und deshalb zu Programmierfehlern führen, sollten Sie folgenden
Tip beherzigen: Solange Ihnen diese Regeln nicht wirklich geläufig sind, spendieren Sie lieber einige
(überflüssige) Klammern, können aber dann sicher sein, dass der Rechner das tut, was Sie eigentlich wollen.
Einige Beispiele sollen die Problematik verdeutlichen:
4.2.6 Beispiele zu logischen Operationen
Automatische Hierarchie
Durch Klammern verdeutlicht/erzwungen
A=B AND C=D
(A=B) AND (C=D) (1)
A=B OR C=D AND E=F
(A=B) OR"C=D) AND(E=F)) (2) ((A=B) OR (C=D))AND(E=F)
A = B AND C
(A= B)AND C (3) (3) A=(B AND C)
Fall (1) ist problemlos. In dieser Entscheidung wird lediglich gefragt, ob gleichzeitig A=B und C=D
ist. Wenn man die jeweils zwei denkbaren Fälle (gleich oder nicht gleich) gegenüber stellt, ergeben
sich insgesamt 4 Kombinationsmöglichkeiten. In der folgenden Art kann man diese Möglichkeiten sehr
übersichtlich darstellen.
1100 A=B
1010 C=D
1000 AND
Die beiden Fälle wahr und falsch sind hier durch die Werte 1 und 0 repräsentiert. Wenn man sich zu der
1 noch das Minus denkt (-1) stellen die Tabellen gleich die internen Werte im Computer dar.
Etwas komplizierter werden die Überlegungen zum Fall 2. Je nach Klammersetzung werden die Operationen in
verschiedener Reihenfolge durchgeführt. Wie die Tabellen zeigen, führt dies zu verschiedenen Ergebnissen:
A=B OR (C=D AND E=F)
(A=B OR C=D) AND E=F
11001100 C=D
11110000 A=B
10101010 E=F
11001100 C=D
10001000 AND
11111100 OR
11110000 A=B
10101010 E=F
11111000 OR
10101000 AND
An diesem Beispiel sehen Sie schon sehr deutlich, dass eine unüberlegt gesetzte (oder weggelassene)
Klammer das Ergebnis grundlegend verändern kann.
Das Beispiel 3 zeigt Ihnen, dass der Computer sogar mit Ausdrücken etwas anfangen kann, die mit
der 'Alltagslogik' nicht mehr zu verstehen sind. Im Sinne der Boolschen Algebra sind diese
Ausdrücke aber exakt definiert und deshalb hat der Computer damit keine Schwierigkeiten:
(A=B) AND C
A = (B AND C)
11110000 A
11001100 B
11001100 B
10101010 C
11000011 =
10001000 AND
10101010 C
11110000 A
10000010 AND
10000111 =
4.3 String-Ausdrücke und -Operatoren
Stringausdrücke sind wesentlich einfacher aufgebaut, als numerische und logische Ausdrücke, da sie nur
einen Operator kennen, also ohne Hierarchieregeln einfach von links nach rechts abgearbeitet werden.
Der Operator für Stringausdrücke ist + und bewirkt die Aneinanderreihung von
Teilstrings von links nach rechts. Diese Reihenfolge kann auch durch Klammern
nicht geändert werden.
Eine häufige Fehlermeldung bei StringausdrÜcken ist STRING TOO LONG ERROR, wenn
der Ergebnis-String oder ein Zwischenergebnis-String länger als 255 Zeichen
werden sollte.
Weiterhin kann es zum TYPE MISMATCH ERROR kommen, wenn anstatt eines Teilstrings
ein Zahlenausdruck im Stringausdruck steht.
Beachten Sie die Reihenfolge der Aneinanderreihung!
10 A$="abc"+123 TYPE MISMATCH ERROR IN 10
Weil 123 nicht in Anführungszeichen eingeschlossen ist, wird es als Zahlen-Konstante und nicht als String-Konstante interpretiert.
10 FOR I = 0 TO 255 20 A$ = A$ + "*" 30 NEXT STRING TOO LONG ERROR IN 20
A$ soll mit '*' aufgefüllt werden. Die Schleife durchläuft aber 256 30 NEXT Werte und will deshalb 256 Zeichen in den String schreiben. Anfangswert 1 statt 0 würde z.B. funktionieren.
Weitere Beispiele sind bei den Befehlen LEFT$, RIGHT$ und MID$ zu finden.
Bis jetzt sind die verschiedenen Datenarten (Zahlen, Strings) vorgestellt worden, sowie ihre Erscheinungsformen
(Konstante, Variable). Um bei den BASIC Befehlen möglichst einfach die einzelnen Parameter beschreiben zu können,
wollen wir den Begriff des Ausdrucks einführen.
Ein Ausdruck kann bestehen aus Konstanten, Variablen, Verknüpfungsoperatoren und Funktionen.
Beispiel:
SIN(7*Z/5)
numerischer Ausdruck
"abc"+A$+LEFT$(Z$,3)
Stringausdruck
A 3 AND B 5
logischer Ausdruck
Wir unterscheiden folgende Ausdrücke nach ihren Ergebnissen: