Anweisungen

Anweisungen können vom folgenden Typ sein:

Anweisungen geben den Kontrollfluss an, wenn ein User-Language-Programm ausgeführt wird. Wenn keine spezifischen Kontrollanweisungen vorhanden sind, werden Anweisungen sequenziell in der Reihenfolge des Erscheinens in der ULP-Datei ausgeführt.

Zusammengesetzte Anweisung

Eine zusammengesetzte Anweisung, auch als Block bezeichnet, ist eine Liste (möglicherweise leer) von Anweisungen in entsprechenden Klammern ({ }) eingeschlossen sind. Syntaktisch kann ein Block als einzelne Anweisung betrachtet werden, er steuert jedoch auch die Bereichsermittlung von Kennungen. Eine innerhalb eines Blocks deklarierte Kennung hat einen Bereich, der am Punkt der Deklaration beginnt und an der schließenden Klammer endet.

Zusammengesetzte Anweisungen können mit jeder beliebigen Tiefe verschachtelt werden.

Ausdrucksanweisung

Eine Ausdrucksanweisung ist ein beliebiger Ausdruck, gefolgt von einem Semikolon.

Eine Ausdrucksanweisung wird durch die Auswertung des Ausdrucks ausgeführt. Alle Nebeneffekte dieser Auswertung werden abgeschlossen, bevor die nächste Anweisung ausgeführt wird. Die meisten Ausdrucksanweisungen sind Zuweisungen oder Funktionsaufrufe.

Ein Sonderfall ist die leere Anweisung, die nur aus einem Semikolon besteht. Eine leere Anweisung hat keine Funktion. Sie kann jedoch in Situationen nützlich sein, in denen die ULP-Syntax eine Anweisung erwartet, das Programm jedoch keine benötigt.

Kontrollanweisungen

Kontrollanweisungen werden verwendet, um den Programmablauf zu steuern.

Zu den Iteration-Anweisungen zählen:

do...while
for
while

Zu den Auswahl-Anweisungen zählen:

if...else
switch

Zu den Sprung-Anweisungen zählen:

break
continue
return

break

Die break-Anweisung hat folgende allgemeine Syntax:

break;

Sie beendet sofort die nächste umgebende do...while-, for-, switch- oder while-Anweisung. Dies gilt auch für Loop-Members von Objekttypen.

Da alle diese Anweisungen gemischt und mit beliebiger Tiefe verschachtelt sein können, sollten Sie darauf achten, dass die break-Anweisung von der richtigen Anweisung aus ausgeführt wird.

continue

Die continue-Anweisung hat folgende allgemeine Syntax:

continue;

Sie überträgt sofort die Kontrolle an die Testbedingung der nächsten umschließenden do...while-, while- oder for-Anweisung oder an den Inkrementausdruck der nächsten umschließenden for-Anweisung.

Da alle diese Anweisungen gemischt und mit beliebiger Tiefe verschachtelt sein können, sollten Sie darauf achten, dass sich die continue-Anweisung auf die richtige Anweisung bezieht.

do...while

Die do...while-Anweisung hat folgende allgemeine Syntax:

do statement while (condition);

Sie führt die Anweisung aus, bis der Bedingungsausdruck null ist. Die Bedingung wird nach der ersten Ausführung der Anweisung getestet, was bedeutet, dass die Anweisung immer mindestens einmal ausgeführt wird.

Wenn die Anweisung keine break- oder return-Anweisung enthält, muss sich die Anweisung auf den Wert der Bedingung auswirken, oder condition selbst muss sich während der Auswertung ändern, um eine Endlosschleife zu vermeiden.

Beispiel:

string s = "Trust no one!";
int i = -1;
do {
   ++i;
   } while (s[i]);

for

Die for-Anweisung hat folgende allgemeine Syntax:

for ([init]; [test]; [inc]) statement

Sie führt die folgenden Schritte aus:

  1. Wenn ein initialisierender Ausdruck init vorhanden ist, wird er ausgeführt.
  2. Wenn ein test-Ausdruck vorhanden ist, wird er ausgeführt. Wenn das Ergebnis ungleich null ist (oder kein test-Ausdruck vorhanden ist), wird die Anweisung ausgeführt.
  3. Wenn ein inc-Ausdruck vorhanden ist, wird er ausgeführt.
  4. Die Kontrolle kehrt schließlich zu Schritt 2 zurück.

Wenn die Anweisung keine break- oder return-Anweisung enthält, muss sich der inc-Ausdruck (oder die -Anweisung) auf den Wert des test-Ausdrucks auswirken, oder test selbst muss sich während der Auswertung ändern, um eine Endlosschleife zu vermeiden.

Der initialisierende Ausdruck init initialisiert normalerweise einen oder mehrere Schleifenzähler. Er kann auch eine neue Variable als Schleifenzähler definieren. Der Bereich einer solchen Variablen ist gültig bis zum Ende des Blocks, der die for-Schleife umschließt.

Beispiel:

string s = "Trust no one!";
int sum = 0;
for (int i = 0; s[i]; ++i)
    sum += s[i]; // sums up the characters in s

if...else

Die if...else-Anweisung hat folgende allgemeine Syntax:

if (expression)
   t_statement
[else
   f_statement]

Der bedingte Ausdruck wird ausgewertet, und wenn der Wert ungleich null ist, wird t_statement ausgeführt. Andernfalls wird f_statement ausgeführt, wenn eine else-Klausel vorhanden ist.

Eine else-Klausel wird immer mit dem letzten if ohne else abgeglichen. Wenn dies nicht Ihren Vorstellungen entspricht, müssen Sie die Anweisungen mithilfe von geschweiften Klammern gruppieren. Beispiel:

if (a == 1) {
   if (b == 1)
      printf("a == 1 and b == 1\n");
   }
else
   printf("a != 1\n");

Zurück

Eine Funktion mit einem anderen return-Typ als void muss mindestens eine return-Anweisung mit der folgenden Syntax enthalten:

return expression;

Dabei muss expression für einen Typ ausgewertet werden, der mit dem return-Typ der Funktion kompatibel ist. Der Wert von expression ist der von der Funktion zurückgegebene Wert.

Wenn die Funktion vom Typ void ist, kann eine return-Anweisung ohne expression verwendet werden, um aus dem Funktionsaufruf zurückzukehren.

switch

Die switch-Anweisung hat folgende allgemeine Syntax:

switch (sw_exp) {
  case case_exp: case_statement
  ...
  [default: def_statement]
  }

Dabei kann die Kontrolle kann je nach Wert von sw_exp (der vom Typ integral sein muss) an eine von mehreren mit case beschrifteten Anweisungen übertragen werden.

Jede case_statement-Anweisung kann mit einer oder mehreren case-Beschriftungen beschriftet werden. Die case_exp-Angabe jeder case-Beschriftung muss für eine konstante Ganzzahl ausgewertet werden, die innerhalb der umschließenden switch-Anweisung eindeutig ist.

Es darf auch höchstens eine Vorgabebeschriftung vorhanden sein.

Nach der Auswertung von sw_exp wird case_exp auf eine Übereinstimmung geprüft. Wenn eine Übereinstimmung gefunden wird, wird die Kontrolle an die case_statement-Anweisung mit der übereinstimmenden case-Beschriftung übergeben. Wenn keine Übereinstimmung gefunden wird und eine Vorgabebeschriftung vorhanden ist, wird die Kontrolle an die def_statement-Anweisung übergeben. Andernfalls wird keine der Anweisungen in switch ausgeführt.

Die Programmausführung wird nicht beeinflusst, wenn case*- und *default-Beschriftungen gefunden werden. Die Kontrolle verläuft einfach durch die Beschriftungen zur folgenden Anweisung.

Um die Ausführung am Ende einer Gruppe von Anweisungen für eine bestimmte case-Anweisung zu beenden, verwenden Sie die break-Anweisung.

Beispiel:

string s = "Hello World";
int vowels = 0, others = 0;
for (int i = 0; s[i]; ++i)
    switch (toupper(s[i])) {
      case 'A':
      case 'E':
      case 'I':
      case 'O':
      case 'U': ++vowels;
                break;
      default: ++others;
      }
printf("There are %d vowels in '%s'\n", vowels, s);

while

Die while-Anweisung hat folgende allgemeine Syntax:

while (condition) statement

Sie führt die Anweisung aus, solange der condition-Ausdruck nicht null ist.

Die Bedingung wird vor der ersten möglichen Ausführung der Anweisung getestet, was bedeutet, dass die Anweisung möglicherweise nicht ausgeführt wird, wenn condition anfänglich null ist.

Wenn die Anweisung keine break- oder return-Anweisung enthält, muss sich die Anweisung auf den Wert der Bedingung auswirken, oder condition selbst muss sich während der Auswertung ändern, um eine Endlosschleife zu vermeiden.

Beispiel:

string s = "Trust no one!";
int i = 0;
while (s[i])
      ++i;