Ein Ausdruck kann also seinerseits wieder aus Ausdrücken zusammengesetzt sein.

Die einfachste Form eines Ausdrucks ist nur eine Konstante oder Variable oder Funktion:

Ausdruck1:= 5
Ausdruck2:= AC
Ausdruck3:= SIN(5)

Die nächstkomplexere Form ist die Verknüpfung zweier Konstanten oder Variablen oder Funktionen

Ausdruck1:= 5+A
Ausdruck2:= AC*BC
Ausdruck3:= 2*SIN(A)

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.

Beispiele von Stringausdrücken:

10 A$="abc"+"123"
20 ?A$
abc123
10 A$="abc":B$="123":A$=B$+A$+"def"
20 ?A$
123abcdef
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.

CCOM - CBM 4032 Benutzerhandbuch

4. Ausdrücke und Operatoren

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:

numerisch Gleitkomma-Ausdrücke
Integer-Ausdrücke
Byte-Ausdrücke
logisch logische Ausdrücke
String String-Ausdrücke

Entsprechend den Datendefinitionen ergibt sich aus einem Gleitkomma-Ausdruck ein Gleitkomma-Ergebnis usw.

Äußerlich unterscheiden sich die drei numerischen Ausdrücke nicht. Dagegen unterscheiden sich numerische, logische und Stringausdrücke sehr stark.

Allen Ausdrücken ist gemeinsam, dass sie sehr komplexe Formen annehmen können. Allgemein kann ein Ausdruck so definiert werden:

Ausdruck := Ausdruckl Operator Ausdruck2