Eigenschaften, die mit diesem Standard neu eingeführt wurden, werden im folgenden besonders angegeben.
Anweisungen und Blöcke sind Thema des Kapitels 6.8 Statements and blocks in C99.
Dieses Kapitel ist Vorbild für diese Seite.
Dabei soll jedoch nicht eine einfache Übersetzung des Standards wiedergegeben werden.
Vielmehr ist es Ziel, Anweisungen getreu dem Standard zu erklären.
Benannte Anweisung
Benannte Anweisungen sind Thema des Kapitels 6.8.1 Labeled statements in C99.
Syntax:
Sowohl die case-Anweisung, wie auch die default-Anweisung dürfen nur in einer <a href='#switch' class='internal' title =''>switch</a>-Anweisung verwendet werden.
Der Bezeichner der benannten Anweisung kann in der gesamten Funktion angesprochen werden.
Sein scope (Anwendungsgebiet) ist die Funktion.
Dies bedeutet, dass der Bezeichner in einer <a href='#goto' class='internal' title =''>goto</a>-Anweisung noch vor seiner Deklaration verwendet werden kann.
Eine zusammengesetzte Anweisung bildet einen Block.
Zusammengesetzte Anweisungen dienen hauptsächlich dazu, mehrere Anweisungen als eine syntaktische Anweisung darzustellen.
So verlangen viele Anweisungen eine Anweisung als Sub-Anweisung.
Sollen jedoch mehrere Anweisungen als Sub-Anweisung angegeben werden, so steht oft nur der Weg zur Verfügung, diese Anweisungen als eine Anweisung zusammenzufassen.
Wesentliches Merkmal der Syntax zusammengesetzter Anweisungen sind die umschließenden geschweiften Klammern ({}).
Bei Anweisungen, welche Sub-Anweisungen erwarten, wie beispielsweise Schleifen oder Verzweigungen, werden geschweifte Klammern so häufig eingesetzt, dass leicht der falsche Eindruck entsteht, sie seien Teil der Syntax der Anweisung.
Lediglich die Syntax einer Funktions-Definition verlangt (in C99) die Verwendung einer zusammengesetzen Anweisung.
Das eben gezeigte Beispiel lässt sich übersetzen, jedoch ist sein Verhalten nicht das Gewünschte.
Der erste Parameter der Applikation soll nur ausgegeben werden, wenn er angegeben wurde.
Jedoch wird nur die erste printf-Anweisung bedingt ausgeführt.
Die zweite printf-Anweisung (eine Ausdrucks-Anweisung) wird stets ausgeführt, auch wenn die Formatierung des Quelltextes einen anderen Eindruck vermittelt.
Repräsentiert der Ausdruck argv[1] keinen gültigen Zeiger, so führt seine Verwendung beim Aufruf der printf-Funktion zu einem undefinierten Verhalten der Applikation.
In der ersten Ausdrucks-Anweisung c = a + b; wird der Ausdruck c = a + b mit seinem Teilausdruck a + b ausgewertet.
Als Seiteneffekt wird sie Summe aus den Werten in a und b gebildet und in dem Objekt c gespeichert.
Der Ausdruck der zweiten Ausdrucks-Anweisung ist der Aufruf der Funktion printf.
Als Nebeneffekt gibt diese Funktion einen Text auf der Standardausgabe aus.
Häufige Ausdrucks-Anweisungen sind Zuweisungen und Funktionsaufrufe.
Leere Anweisung
Wird der Ausdruck in der Ausdrucks-Anweisung weggelassen, so wird von einer leeren Anweisung gesprochen.
Leere Anweisungen werden verwendet, wenn die Syntax der Sprache C eine Anweisung verlangt, jedoch keine gewünscht ist.
Beispiel:
Verzweigungen
Die Auswahl-Anweisungen werden in C99 im Kapitel 6.8.4 Selection statements beschrieben.
if
Syntax:
In beiden Formen der if-Anweisung muss der (Kontroll-)Ausdruck von einem skalaren Datentypen sein.
Bei beiden Formen wird die erste Sub-Anweisung nur dann ausgeführt, wenn der Wert des Ausdruckes ungleich 0 (Null) ergibt.
In der zweiten Form der if-Anweisung wird die Sub-Anweisung nach den Schlüsselwortelse nur dann ausgeführt, wenn der Kontrollausdruck den Wert 0 darstellt.
Wird die erste Sub-Anweisung über einen Sprung zu einer benannten Anweisung erreicht, so wird die Sub-Anweisung im else-Zweig nicht ausgeführt.
Das Schlüsselwort else bindet sich stets an jenes if, das vor der vorangegangenen Anweisung steht.
Die if-Anweisung stellt, wie der Name schon sagt, eine Anweisung dar.
Daher kann eine if-Anweisung ebenso als Sub-Anweisung einer anderen Anweisung verwendet werden.
Wird eine if-Anweisung als Sub-Anweisung einer anderen if-Anweisung verwendet, so ist darauf zu achten, dass sich ein eventuell vorhandenes else stets an das voranstehende if bindet.
Die Formatierung des Quelltextes im letzten Beispiel erweckt den Eindruck, dass der Text Es wurde kein Argument übergeben. nur dann ausgegeben wird, wenn der Ausdruckargc > 1 den Wert 0 ergibt.
Jedoch ist Ausgabe des Textes davon abhängig, ob der Ausdruck argc == 2 den Wert 0 ergibt.
Somit wird beim Fehlen eines Parameters kein Text ausgegeben und im Fall von mehreren Parametern erhalten wir die Fehlinformation, dass keine Parameter übergeben worden seien.
Soll das gewünschte Verhalten erreicht werden, so kann die if-Anweisung, welche die erste Sub-Anweisung darstellt, durch eine zusammengesetzte Anweisung ersetzt werden.
Noch einmal auf deutsch: sie kann geklammert werden.
So findet im folgenden Beispiel das Schlüsselwort else vor sich eine zusammengesetzte Anweisung und vor dieser Anweisung jenes if, welches mit dem Kontrollausdruck argc > 1 behaftet ist.
Ebenso wird die zusammengefasste Anweisung verwendet, wenn mehrere Anweisungen bedingt ausgeführt werden sollen.
Da die if-Anweisung stets nur eine Anweisung als Sub-Anweisung erwartet, können zum bedingten Ausführen mehrerer Anweisungen, diese wiederum geklammert werden.
Im nächsten Beispiel findet das letzte else als erste Sub-Anweisung eine if-Anweisung mit einem else-Zweig vor. Diese (Sub-)Anweisung ist abgeschlossen und kann nicht mehr erweitert werden.
Daher kann sich an eine solche if-Anweisung das letzte else nicht binden.
Es gibt keine Form der if-Anweisung mit zweielse-Zweigen.
Somit arbeitet das folgende Programm auch ohne Klammern wie erwartet.
Im letzten Beispiel zum Thema der if-Anweisung soll noch gezeigt werden, wie sich ein Programm verhält, bei dem in eine Sub-Anweisung über einen Sprung aufgerufen wird.
Obwohl der Ausdruck1==2 offensichtlich den Wert 0 liefert, wird der else-Zweig nicht ausgeführt.
switch
Die switch-Anweisung wird im Kapitel 6.8.4.2 The switch statement in C99 besprochen.
Syntax:
Die switch-Anweisung erlaubt eine Verzweigung mit mehreren Sprungzielen.
Ihr Vorteil gegenüber der <a href='#if' class='internal' title =''>if</a>-Anweisung ist eine bessere Übersicht über den Programmfluss.
Der Ausdruck muß einen ganzzahligen Datentypen (integer) haben.
Er ist der Kontrollausdruck.
Der ganzzahlige Datentyp des Kontrollausdrucks ist eine Einschränkung gegenüber der <a href='#if' class='internal' title =''>if</a>-Anweisung, die in dem Bedingungs-Ausdruck einen skalaren Datentypen verlangt.
Der Wert des Kontrollausdrucks bestimmt, zu welcher <a href='#Benannte_Anweisung' class='internal' title =''>case</a>-Anweisung einer zugehörigen Anweisung gesprungen wird.
In fast allen Fällen ist die zugehörige Anweisung eine zusammengefasste Anweisung ({}), welche die verschiedenen case-Anweisungen aufnimmt.
Im letzten Beispiel werden zwei switch-Anweisungen gezeigt.
Die erste switch-Anweisung zeigt, daß geschweifte Klammern nicht zwangsläufig notwendig sind, jedoch wird in einem solchen Fall eher eine <a href='#if' class='internal' title =''>if</a>-Anweisung verwendet werden.
Eine case-Anweisung bildet ein mögliches Sprungziel, bei dem die Programmausführung fortgesetzt wird.
Die zweite switch-Anweisung im letzten Beispiel definiert zwei case-Anweisungen.
Es werden zwei Sprungziele für den Fall definiert, dass argc den Wert 3 bzw. den Wert 2 hat.
Der Ausdruck von case muss eine Konstante sein.
Dabei darf der Wert des Ausdruck nicht doppelt vorkommen.
Hat ein case-Ausdruck einen anderen Typen als der Kontrollausdruck, so wird der Wert des case-Ausdruckes in den Typen des Kontrollausdruckes gewandelt.
Wird zu einem der beiden case-Anweisungen gesprungen, so werden auch alle nachfolgenden Anweisungen ausgeführt.
Soll die Abarbeitung innerhalb der zugehörigen Anweisung abgebrochen werden, so kann die <a href='#break' class='internal' title =''>break</a>-Anweisung eingesetzt werden.
So verhindert die break-Anweisung im nachfolgenden Beispiel, dass beide Meldungen ausgegeben werden, wenn kein Parameter beim Programmaufruf angegeben worden sein sollte.
Jedoch fehlt eine break-Anweisung zwischen case -1: und case 0:.
Dies hat zur Folge, dass in beiden Fällen die Meldung Kein Parameter angegeben ausgegeben wird.
Der Ausdruck argc - 1 nimmt den Wert -1 an, wenn auch kein Programmname verfügbar ist.
Ergibt der Bedingungsausdruck einen Wert, zu dem es keinen entsprechenden Wert in einer case-Anweisung gibt, so wird auch in keinen case-Zweig der zugehörigen Anweisung von switch gesprungen.
Für diesen Fall kann eine Anweisung mit der Marke default: benannt werden.
Bei der so benannten Anweisung wird die Programmausführung fortgesetzt, wenn kein case-Zweig als Sprungziel gewählt werden konnte.
Es darf nur eine default-Marke in einer switch-Anweisung geben.
Schleifen (Iterations-Anweisungen) werden im Kapitel 6.8.5 Iteration statements in C99 beschrieben.
while
Die while-Anweisung ist Thema des Kapitels 6.8.5.1 The while statement in C99.
Syntax:
Der Kontrollausdruck muß von einem skalaren Datentypen sein.
Er wird vor einer eventuellen Ausführung der zugehörigen Anweisung (Schleifenkörper) ausgewertet.
Der Schleifenkörper wird ausgeführt, wenn der Kontrollausdruck einen Wert ungleich 0 ergeben hatte.
Nach jeder Ausführung des Schleifenkörpers wird Kontrollausdruck erneut ausgewertet um zu prüfen, ob mit der Abarbeitung des Schleifenkörpers fortgefahren werden soll.
Erst wenn der Kontrollausdruck den Wert 0 ergibt, wird die Abarbeitung abgebrochen.
Ergibt der Kontrollausdruck schon bei der ersten Auswertung den Wert 0, so wird der Schleifenkörper überhaupt nicht ausgeführt.
Die while-Anweisung ist eine kopfgesteuerte Schleife.
Sowohl die while-Anweisung, wie auch deren zugehörige Anweisung (Schleifenkörper) bilden je einen Block.
Siehe auch:<a href='#do' class='internal' title =''>do</a>, <a href='#for' class='internal' title =''>for</a>, Block
do
Die do-Anweisung wird im Kapitel 6.8.5.2 The do statement in C99 beschrieben.
Syntax:
Im Gegensatz zur while-Anweisung wertet die do-Anweisung den Kontrollausdruck erst nach der Ausführung einer zugehörigen Anweisung (Schleifenkörper) aus.
Die Ausführung des Schleifenkörpers wird solange wiederholt, bis der Kontrollausdruck den Wert 0 ergibt.
Dadurch, dass der Kontrollausdruck erst nach der Ausführung des Schleifenkörpers ausgewertet wird, ist mindestens eine einmalige Ausführung des Schleifenkörpers garantiert.
Die do-Anweisung ist eine fußgesteuerte Schleife.
Sowohl die do-Anweisung, wie auch deren zugehörige Anweisung (Schleifenkörper) bilden je einen Block.
Siehe auch:<a href='#while' class='internal' title =''>while</a>, <a href='#for' class='internal' title =''>for</a>, Block
Neben der klassischen Rolle einer fußgesteuerten Schleife bietet sich die do-Anweisung an, wenn ein Makro mit mehreren Anweisungen geschrieben werden soll.
Dabei soll das Makro der Anforderung genügen, wie eine Anweisung, also wie im folgenden Codefragment verwendet werden zu können.
Bei der Definition des Makros fehlt das abschließende Semikolon, dass in der Syntax der do-Anweisung verlangt wird.
Dieses Semikolon wird bei der Verwendung des Makros (in der if-Anweisung) angegeben.
Die do-Anweisung ist eine Anweisung und da der Kontrollausdruck bei der Auswertung den (konstanten) Wert 0 ergibt, wird der Schleifenkörper (Kapitel 6.3 der FAQ von dclc.
for
Die for-Anweisung ist Thema des Kapitels 6.8.5.3 The for statement in C99.
Die for-Anweisung (erste Form bei C99) verlangt bis zu drei Ausdrücke.
Alle drei Ausdrücke sind optional.
Werden die Ausdrücke Ausdruck-1 oder Ausdruck-3 angegeben, so werden sie als void-Ausdrücke ausgewertet.
Ihre Werte haben also keine weitere Bedeutung.
Der Wert von Ausdruck-2 hingegen stellt den Kontrollausdruck dar.
Wird dieser ausgelassen, so wird ein konstanter Wert ungleich 0 angenommen.
Dies stellt eine Endlosschleife dar, die nur durch eine Sprunganweisung verlassen werden kann.
Zu Beginn der for-Anweisung wird der Ausdruck-1 ausgewertet.
Der Wert von Ausdruck-2 muss von einem skalaren Datentypen sein und sein Wert wird vor einer eventuellen Ausführung der zugehörigen Anweisung (Schleifenkörper) ausgewertet.
Nach einer Ausführung des Schleifenkörpers wird der Ausdruck-3 ausgewertet.
Wird der Schleifenkörper nicht ausgeführt, so wird auch nicht der Ausdruck-3 ausgewertet.
Das letzte Beispiel zeigt, wie eine for-Anweisung durch eine while-Anweisung ersetzt werden könnte.
Es soll nicht unerwähnt bleiben, dass die beiden Formen nicht dasselbe darstellen.
Zum Einen stellt die for-Anweisung eine Anweisung dar, während in dem Beispiel die while-Anweisung von einer Ausdrucksanweisung begleitet wurde.
Würden wir beide Anweisungen zusammenfassen, so würden wir einen Block mehr definieren.
Sowohl die for-Anweisung, wie auch deren Schleifenkörper bilden je einen Block.
Auch wenn alle drei Ausdrücke optional sind, so sind es die Semikoli (;) nicht.
Die Semikoli müssen alle angegeben werden.
Mit dem StandardC99 ist die Möglichkeit eingeführt worden, eine Deklaration angeben zu können.
Dabei ersetzt die Deklaration den Ausdruck-1und das erste Semikolon.
Bei der Angabe der Definition wurde keineswegs die Angabe eines Semikolons zwischen der Deklaration und dem Ausdruck-2 vergessen.
In dieser Form ist die Angabe der Deklarationnicht optional, sie muss also angegeben werden.
Eine Deklaration wird immer mit einem Semikolon abgeschlossen.
Wird diese Form der for-Anweisung verwendet, so ergibt sich das oben fehlende Semikolon durch die Angabe einer Deklaration.
Der Geltungsbereich der mit Deklaration deklarierten Bezeichner umfasst sowohl Ausdruck-2, Ausdruck-3 wie auch Anweisung, dem Schleifenkörper.
Selbstverständlich steht der Bezeichner auch innerhalb von Deklaration zur Verfügung, soweit dies nach der Syntax von Deklarationen in C definiert ist.
Die Verwendung der goto-Anweisung hat gelegentlich einen, für den Menschen schwer lesbaren Programmcode zur Folge.
Wie hoch die Lesbarkeit eines Quelltextes für einen Menschen als Qualitätsmerkmal für ein Programm bewertet wird, dass für einen Rechner geschrieben wurde, ist individuell verschieden.
Dennoch soll nicht verschwiegen werden, dass die goto-Anweisung einen schlechten Ruf besitzt und viele Programmierer von ihrer Verwendung abraten.
Dieser sollte jedoch nicht dazu führen, dass auf die goto-Anweisung verzichtet wird, obwohl ihre Verwendung eine einfachere Programmstruktur zur Folge gehabt hätte.
continue
Syntax:
continue ;
Die continue-Anweisung darf nur in den Schleifenanweisungen <a href='#while' class='internal' title =''>while</a>, <a href='#do' class='internal' title =''>do</a> und <a href='#for' class='internal' title =''>for</a> verwendet werden.
Die break-Anweisung ist Thema der Kapitels 6.8.6.3 The break statement in C99.
Syntax:
break ;
Die break-Anweisung bricht die </code>for</code>, <a href='#do' class='internal' title =''>do</a>, <a href='#while' class='internal' title =''>while</a> oder <a href='#switch' class='internal' title =''>switch</a>-Anweisung ab, die der break-Anweisung am nächsten ist.
Bei einer </code>for</code>-Anweisung wird nach einer break-Anweisung der Ausdruck-3 nicht mehr ausgewertet.
Der Ausdruck in der return-Anweisung ist optional.
Dennoch gelten für ihn besondere Regeln.
So darf der Ausdruck in Funktionen vom Typ void nicht angegeben werden.
Ebenso darf der Ausdruck nur in Funktionen vom Typ void weggelassen werden.
Hat der Ausdruck der return-Anweisung einen anderen Typ als die Funktion, so wird der Wert des Ausdruckes in den Typ gewandelt, den die Funktion hat.
Dies geschieht nach den gleichen Regeln, wie bei einer Zuweisung in ein Objekt vom gleichen Typen wie die Funktion.
Begriffserklärungen
Die Begriffe in diesem Abschnitt werden im Kapitel 6.8 Statements and blocks in C99 erklärt.
Die Erklärung von full expression, die in dem gleichen Kapitel beschrieben ist, soll in Ausdruck (Programmiersprache C)#full_expression erklärt werden.
Anweisung
Eine Anweisung ist eine Handlung, die ausgeführt wird.
Eine Anweisung wird ein einer Sequenz ausgeführt.
Jedoch kann eine Anweisung in mehrere Sequenzen aufgeteilt sein.
Gelegentlich ist die Aussage zu lesen, dass in der Sprache C alle Anweisungen mit einem Semikolon abgeschlossen werden.
Ein Block ist eine Gruppe von möglichen Deklarationen und Anweisungen.
Bei jedem Eintritt in einen Block werden die Objekte der Deklarationen neu gebildet.
Davon sind lediglich Arrays mit einer variablen Länge ausgenommen.
Initialisiert werden die Objekte mit der Speicherdauer automatic storage duration und Arrays mit variabler Länge jeweils zu dem Zeitpunkt, wenn die Programmausführung zu der entsprechenden Deklaration kommt und innerhalb der Deklaration selbst nach den Regeln für Deklarationen der Sprache C.
Die Deklaration wird dann wie eine Anweisung betrachtet.
Die Speicherdauer der Objekte ist automatic storage duration, wenn nicht der Speicherklassenspezifizierer static angegeben wurde.
Nach 5.2.4.1 Translation limits aus C99 wird eine Verschachtelungstiefe bei Blöcken von mindestens 127 Ebenen garantiert.
Siehe auch: Zusammengesetzte Anweisung, Schleifen, Kapitel 6.2.4 Storage durations of objects (Abs. 5) in C99.
Dieser Beitrag ist aus der XML-Version der deutschen WikiPedia® entwickelt worden und unterliegt inhaltlich den GNU FDL-Lizenzbestimmungen. Linkziele außerhalb der wikipedia-Inhalte unterliegen den Urheberrechten der jeweiligen Anbieter
( DirectDownloads ) Kalenderblätter druckfertig aufbereitet für Schmuckblätter zum Selbstdrucken im Word DOC6/RTF Format, je Euro 5 über Click&BuyJAN | FEB | MÄRZ APRIL | MAI | JUNI JULI | AUG | SEPT OKT | NOV | DEZ
Das Geschenk für jeden Anlass, nicht nur bei 'runden' Jubiläen Andere Einzeltage oder Zahlungsarten bitte HIER bestellen
Diese Web Site verdient ihr Geld durch Produktverkäufe (CD-ROM, downloads) und in erster Linie durch Anzeigen. Wenn Sie als Webmaster zuverlässige Partner suchen für Ihr eigenes Anzeigenschäft, dürfen Sie sich gerne auf unsere Empfehlungen stützen:
z.B.: GigaCash & ProfiWin