Auswertungsanweisungen in C
Ausgabe von Auswertungen
Die Auswertung des Ausdrucks »putchar( 86 )« führt zur Ausgabe des Zeichens »V«. Wenn dieser Ausdruck in eine Ausgabeanweisung eingesetzt wird, so wird außerdem noch sein Wert »86« ausgegeben – von der Ausgabeanweisung.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( 86 )); }Protokoll
V86
Auswertung ohne Ausgabe
In einer Ausgabeanweisung kann als Format auch, wie in dem folgenden Beispiel, die leere Zeichenfolge »« verwendet werden. Dann wird der zweite Argumentausdruck zwar ausgewertet, aber sein Wert wird nicht ausgegeben.
main.c
#include <stdio.h>
int main( void )
{ printf
( "", putchar( 86 )); }Protokoll
V
Wir sind damit in der Lage, den Ausdruck »putchar( 86 )« nur auszuwerten, ohne den Wert jenes Ausdrucks dann weiter zu verwenden. Damit wird es klar, daß die Ausgabe des Programms, also »v« ein Konsequenz der Auswertung des Ausdrucks »putchar( 86 )« ist.
- C 2015
- If there are insufficient arguments for the format, the behavior is undefined. If the format is exhausted while arguments remain, the excess arguments are evaluated (as always) but are otherwise ignored.
Die Auswertungsanweisung
Anstatt eine Ausgabeanweisung mit einem leeren Format zu verwenden, können wir einen auszuwertenden Ausdruck auch selber als eine Anweisung in das Programm schreiben, wenn wir ihm noch ein Semikolon »;« nachstellen.
main.c
#include <stdio.h>
int main( void )
{ putchar( 86 ); }stdout
V
In die geschweiften Klammern darf eine Anweisung geschrieben werden, und »putchar( 86 );« ist eine Anweisung, eine sogenannte Auswertungsanweisung. Die Auswertungsanweisung besteht aus einem Ausdruck und einem Semikolon »;«.
Bei der Ausführung einer Auswertungsanweisung wird ihr Ausdruck ausgewertet. Dabei tritt die Wirkung (die Ausgabe von »V«) ein. Der Wert des Ausdrucks »putchar( 86 )«, also »86«, wird aber nicht ausgegeben.
Die Syntax der Auswertungsanweisung
Die Anweisung »putchar( 86 );« besteht aus dem Ausdruck »putchar( 86 )« und einem Semikolon »;«. Diese ist ein allgemeines Bildungsprinzip in C : Wenn ein Semikolon hinter einen Ausdruck geschrieben wird, erhält man eine Anweisung. Eine Anweisung dieser Art nennen wir eine Auswertungsanweisung.
Eine Auswertungsanweisung besteht aus einem Ausdruck und einem Semikolon.
Das Semikolon am Ende der Auswertungsanweisung ist eine lexikalische Einheit.
- Auswertungsanweisung (Beispiel)
putchar( 86 );
- Zerlegung einer Auswertungsanweisung
putchar( 86 ) ;
'-----------------------------------' '-----------'
Ausdruck Semikolon| |
'--------------------------------------------------------------'
Auswertungsanweisung- Auswertungsanweisung (Syntaxdiagramm)
.----------. .-.
---->| Ausdruck |---->( ; )---->
'----------' '-'
Ein Ausdruck alleine – ohne folgendes Semikolon – ist keine Anweisung.
Die Semantik der Auswertungsanweisung
Bei der Ausführung einer Auswertungsanweisung wird ihr Ausdruck ausgewertet. Der Wert, den jene Auswertung ergibt, wird nicht verwendet.
Das Semikolon erlaubt es sozusagen, einen Ausdruck als Anweisung zu schreiben. Da eine Anweisung aber – im Gegensatz zu einem Ausdruck – keinen Wert haben kann, ist es ganz natürlich, daß der Wert des Ausdrucks dabei verloren geht.
Die Auswertung eines Ausdrucks kann eine Wirkung haben und einen Wert ergeben.
Die Ausführung einer Anweisung kann nur eine Wirkung haben, aber nie einen Wert ergeben.
Verwendungsmöglichkeiten von Ausdrücken
Wir kennen jetzt folgende Möglichkeiten zur Verwendung von Ausdrücken in Programmen:
Ein Ausdruck kann verwendet werden als
- Operand eines Operators, als
- Argument eines Aufrufs oder als
- Konstituent (also Bestandteil) einer Auswertungsanweisung.
Beispiele zur Auswertungsanweisung
● Beispiel
Bei der Ausführung der Auswertungsanweisung »86;« wird der Ausdruck »86« ausgewertet. Da die Auswertung des Ausdrucks »86« keine Wirkung hat, hat dieses Programm insgesamt keine Wirkung.
main.c
int main( void )
{ 86; }stdout
- (keine Ausgabe)
● Beispiel
Bei der Ausführung der Auswertungsanweisung »rand;« wird der Ausdruck »rand« ausgewertet. Da die Auswertung des Ausdrucks »rand« keine Wirkung hat, hat dieses Programm insgesamt keine Wirkung.
main.c
#include <stdlib.h>
int main( void )
{ rand; }stdout
- (keine Ausgabe)
● Beispiel
Bei der Ausführung der Auswertungsanweisung »rand();« wird der Ausdruck »rand()« ausgewertet. Da die Auswertung des Ausdrucks »rand()« keine Wirkung hat, hat dieses Programm insgesamt keine Wirkung.
main.c
#include <stdlib.h>
int main( void )
{ rand(); }stdout
- (keine Ausgabe)
● Beispiel
Bei der Ausführung der Auswertungsanweisung »cos( 0 );« wird der Ausdruck »cos( 0 )« ausgewertet. Da die Auswertung des Ausdrucks »cos( 0 )« keine Wirkung hat, hat dieses Programm insgesamt keine Wirkung.
main.c
#include <math.h>
int main( void )
{ cos( 0 ); }stdout
- (keine Ausgabe)
Es ist ein gelegentliches Mißverständnis zu glauben, das bloße Hinschreiben eines Wertes in einem Programm (hier z.B. »cos( 0 )«) würde dessen Ausgabe bewirken. Die Ausgabe muß aber immer ausdrücklich verlangt werden, beispielsweise mit Hilfe von »printf«. Da das über diesem Absatz stehende Programm solch eine Ausgabe nicht vorsieht, wird von ihm auch nichts ausgegeben.
Funktionsnamen als Ausdrücke
Der Ausdruck "putchar" führt ohne Aufrufoperator (ohne die runden Klammern) nicht zur Aktivierung einer Funktion, obwohl er in der Ausdruckanweisung "putchar;" ausgewertet wird. Die Auswertung eines Funktionsnamens hat in C nämlich keine Wirkung. Höchstens ein Funktionsaufruf (mit runden Klammern) kann eine Wirkung haben.
main.c
#include <stdio.h>
int main( void )
{ putchar; }
Übungsfragen
? Auswertungsanweisung
Welcher der folgenden Texte (ohne die umschließenden Anführungszeichen) ist nach dem oben Gesagten sicher eine Auswertungsanweisung?
- »getchar()«
- »getchar();«
- »getchar«
- keiner der obigen Antwortvorschläge trifft zu
? Satz
Ergänzen Sie den folgenden Satz durch das Einsetzen einer Form eines Verbes.
- Satz
- Bei der Ausführung der Auswertungsanweisung wird ihr Ausdruck __________.
? Übungsfrage
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ putchar( 86 ); }
? Übungsfrage (1)
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ putchar; }
? Übungsfrage (3)
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ 86; }
? Übungsfrage (4)
Welche Ausgabe erzeugt das folgende Programm?
(84: T, 85: U, 86: V, 87: W, 88: X)
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", putchar( 86 )); }
? Lexikalische Einheiten zählen ⃗
Wie viele lexikalische Einheiten enthält die Auswertungsanweisung »getchar();«?
Übungsaufgaben
/ Ausgabe eines »V«
Schreiben Sie ein Programm, das mit Hilfe von »putchar« (und ohne Verwendung einer anderen Funktion) das Zeichen »V« ausgibt.
Es soll sich um ein möglichst kurzes Programm handeln, das nichts anderes ausgibt (es ist nur erlaubt, am Ende noch ein Zeilenende auszugeben).
(84: T, 85: U, 86: V, 87: W, 88: X)
- Dokumentation
#include <stdio.h>
int putchar( int c );
- Wirkung schreibt das Zeichen mit der Kennzahl »c«.
- Wert »c«
/ Ausgabe der Kennzahl eines eingelesenen Zeichen
Schreiben Sie ein Programm, das den Wert eines Aufrufs von »getchar()« mit Hilfe von »printf« (und ohne Verwendung anderer Funktionen) ausgibt.
- Dokumentation
#include <stdio.h>
int getchar( void );
- Wirkung Einlesen eines Zeichens von der Konsole.
- Wert Die Kennzahl des von der Konsole eingelesenen Zeichens
/ Ausgabe eines eingelesenen Zeichen
Schreiben Sie ein Programm, das ein mit »getchar« eingelesenes Zeichen mit »putchar« (und ohne Verwendung anderer Funktionen) wieder ausgibt.
Bei dieser Aufgabe darf »printf« nicht verwendet werden.
- Dokumentation
#include <stdio.h>
int putchar( int c );
- Wirkung schreibt das Zeichen mit der Kennzahl »c«.
- Wert »c«
- Dokumentation
#include <stdio.h>
int getchar( void );
- Wirkung Einlesen eines Zeichens von der Konsole.
- Wert Die Kennzahl des von der Konsole eingelesenen Zeichens
- Beispiel für eine Benutzereingabe und eine Systemausgabe (beim Ablauf des Programms)
7↵
7
(Wie alle in diesem Kurs gestellten Aufgaben soll auch diese Aufgabe ausschließlich mit den bisher in diesem Kurs vorgestellten Sprachelementen gelöst werden.)
/ Ausgabe des Nachfolgers eines eingelesenen Zeichen
Schreiben Sie ein Programm, das den Nachfolger einer mit »getchar« eingelesenen Ziffer (0-8) mit »putchar« (und ohne Verwendung anderer Funktionen) wieder ausgibt. (Die Zeichenkennzahl des Nachfolgers einer Ziffer ist um 1 größer als die Kennzahl der Ziffer selber).
Bei dieser Aufgabe darf »printf« nicht verwendet werden.
Beispiel für eine Benutzereingabe und eine Systemausgabe
7↵
8
(Wie alle in diesem Kurs gestellten Aufgaben kann und muß auch diese Aufgabe ausschließlich mit den bisher in diesem Kurs vorgestellten Sprachelementen gelöst werden.)
Bezeichnungen der Auswertungsanweisung ⃗
Da die Auswertungsanweisung hauptsächlich aus einem Ausdruck besteht, wird sie offiziell Ausdruckanweisung oder Ausdrucksanweisung genannt.
„Ausdruckanweisung“ bedeutet hier nicht, daß die Anweisung etwas ausdruckt muß, sondern kommt vom Fachbegriff „Ausdruck “ für einen Quelltextteil mit einem Wert, der nicht vom Verb „ausdrucken“ sondern vom Verb „ausdrücken“ kommt.
Falls die Auswertungsanweisung aus einem Funktionsaufruf vor einem Semikolon besteht, so kann man sie auch Aufrufanweisung nennen, da ihre Wirkung im Aufruf einer bestimmten Funktion besteht.
Falls die Auswertungsanweisung aus dem Aufruf einer Ausgabefunktion, wie »printf« oder »putchar« besteht, so kann man sie auch Ausgabeanweisung nennen, da ihre Wirkung in einer Ausgabe besteht.
Da die Auswertungsanweisung den bei der Auswertung erhaltenen Wert ignoriert und nur die Wirkung der Auswertung erfolgt, könnte man diese Anweisung aber auch als Wirkungsanweisung bezeichnen.
Man kann sie auch als Werteverwurf bezeichnen, wenn man betonen will, daß sie den Wert ihres Ausdrucks verwirft (also nicht verwendet).
Um nicht zu viele verschiedene Begriffe zu verwenden, gebrauchen wir im folgenden aber meist den Begriff Auswertungsanweisung.
Zitate *
- C 8.8.3 2015-04-04
- Syntax
- expression-statement:
- expressionopt ;
- Semantics
- The expression in an expression statement is evaluated as a void expression for its side effects.
- A null statement (consisting of just a semicolon) performs no operations.