Die Ausdruckklammern in C
Einführendes Beispiel
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", ( 65 )); }stdout
65
Syntax
Das Zeichen »(« wird „runde Klammer auf“ genannt.
Das Zeichen »)« wird „runde Klammer zu“ genannt.
- Syntax
Primaerausdruck
.----------.
---.------------>| Literal |------------.--->
| '----------' |
| .-. .----------. .-. |
'--->( ( )--->| Ausdruck |--->( ) )---'
'-' '----------' '-'Vorzeichenausdruck
.--------------------.
--->.------------>| Primaerausdruck |----.---->
| '--------------------' ^
| .-. .--------------------. |
'--->( - )--->| Vorzeichenausdruck |----'
| '-' '--------------------' |
| .-. .--------------------. |
'--->( + )--->| Vorzeichenausdruck |----'
'-' '--------------------'Ausdruck
.---------------------.
--->| Vorzeichenausdruck |--->
'---------------------'
Syntax Wird ein Ausdruck in runde Klammern eingeschlossen, so gilt dies wieder als ein Ausdruck. Während »-« ein Präfixoperator ist, ist »( … )« ein Zirkumfixoperator : Das heißt, »-« steht vor seinem Operandenausdruck, aber »(…)« umgibt seinen Operandenausdruck.
Nach der C -Norm sind die Ausdruckklammern kein Operator, aber wir behandeln sie in diesem Text als Operatoren, da sie allen Ansprüchen genügen, die wir an Operatoren stellen.
Ein Primärausdruck ist ein Ausdruck, der überall als Operand eingesetzt werden kann, ohne eingeklammert werden zu müssen. Ein Literal ist ein Primärausdruck, da er nicht weiter zerlegbar ist. Ein eingeklammerter Ausdruck ist ein Primärausdruck, weil er schon eingeklammert ist.
Typanforderungen
Typanforderungen Ein Ausdruck eines beliebigen Typs darf eingeklammert werden.
Typ
Typergebnis Der Typ des gesamten Ausdrucks ist der Typ des eingeklammerten Ausdrucks.
Die folgenden Typregeln bringen dies symbolisch zum Ausdruck. Sie sind nicht als C -Quelltext zu verstehen.
- Typregel für Ausdruckklammern
- ( int )= int
( double )= double
( char * )= char *
Wert
Wert Bei der Auswertung der Ausdruckklammern wird der eingeklammerte Ausdruck ausgewertet. Der Wert des Ausdrucks mit den Klammern ist derselbe Wert, wie der Wert des Ausdrucks in den Klammern. (Das Einklammern ändert den Wert nicht.)
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", ( 65 )); }stdout
65
main.c
#include <stdio.h>
int main( void )
{ printf
( "%s\n", ( "Text" )); }stdout
Text
Auch Teilausdrücke können immer eingeklammert werden, ohne den Wert des gesamten Ausdrucks zu verändern.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", -65 ); }- Protokoll
-65
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", -( 65 )); }- Protokoll
-65
Syntaktische Rekursion
Da ein eingeklammerter Ausdruck wieder ein Ausdruck ist, kann dieser selber auch wieder eingeklammert werden.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", (( 65 ))); }stdout
65
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", ((( 65 )))); }stdout
65
Kombinationen verschiedener Operatoren
Wenn die in diesem Kurs oft einzeln vorgestellten Sprachelemente angewendet werden, werden sie oft miteinander kombiniert. In diesem Kurs können nicht alle möglichen Kombinationen vorgestellt werden. Der Leser muß später also selber an die Möglichkeit denken, neue Kombinationen bilden zu können.
Beispielhaft werden hier einige mögliche Kombinationen gezeigt:
Der Klammeroperator kann einen beliebigen Ausdruck einklammern. Dies kann auch ein Ausdruck sein, der mit einem Minusoperator gebildet wurde.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", ( -65 )); }stdout
-65
- syntaktische Kombination
Ausdruck
.--------------------------------------.
| Ausdruck (Vorzeichenausdruck) |
.-. | .-. .--------------------. | .-.
--->( ( )-->|--->( - )-->| Vorzeichenausdruck |--->|--->( ) )--->
'-' | '-' '--------------------' | '-'
| |
'--------------------------------------'
Der Minusoperator kann vor einem beliebigen numerischen Ausdruck stehen. Dies kann auch ein numerischer Ausdruck sein, der mit einem Klammeroperator gebildet wurde.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", -( 65 )); }stdout
-65
- syntaktische Kombination
Ausdruck
.-------------------------------------.
| Ausdruck |
.-. | .-. .----------. .-. |
--->( - )-->|--->( ( )-->| Ausdruck |--->( ) )--->|--->
'-' | '-' '----------' '-' |
| |
'-------------------------------------'
Das folgende Beispiel zeigt, wie die Klammern (an Stelle eines Leerraums) verwendet werden können, um eine Folge zweier Minusoperatoren (im Gegensatz zum Operator »--«) zu bilden.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", -(-65 )); }stdout
65
Da die Klammern den Wert eines eingeklammerten Ausdrucks nicht verändern, ordnen wir ihnen keine eigenständige Operation zu. Das heißt beispielsweise, daß bei der Auswertung von »-(-65)« zwei Operationen stattfinden: zuerst die Auswertung des inneren Minus-Ausdrucks, dann die Auswertung des äußeren Minus mit dem Ergebnis der vorherigen Operation als Argumentwert.
Auch ohne Klammern wird eine (leerraumgetrennte) Folge zweier Minusoperatoren als Anwendung des linken Minusoperators auf des Ergebnis des rechten interpretiert (und nicht als Anwendung des linken Operators auf den rechten Operator), also ist »- -65« gleich »-(-65)« und nicht gleich »(- -)65«. Dies wird auch manchmal beschrieben, indem der Operator »-« als „rechtsassoziativ“ bezeichnet wird.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", - -65 ); }stdout
65
Übungsfragen
? Übungsfrage
- Syntax
Primaerausdruck
.----------.
---.------------>| Literal |------------.--->
| '----------' |
| .-. .----------. .-. |
'--->( ( )--->| Ausdruck |--->( ) )---'
'-' '----------' '-'Vorzeichenausdruck
.--------------------.
--->.------------>| Primaerausdruck |----.---->
| '--------------------' ^
| .-. .--------------------. |
'--->( - )--->| Vorzeichenausdruck |----'
| '-' '--------------------' |
| .-. .--------------------. |
'--->( + )--->| Vorzeichenausdruck |----'
'-' '--------------------'Ausdruck
.---------------------.
--->| Vorzeichenausdruck |--->
'---------------------'
Welcher der folgenden Texte ist nach dem obenstehendem Syntaxdiagramm ein Ausdruck?
- A »(-)«
- B »(2)«
- C »()«
- D »(int)«
- E »(2«
- F »(2)2«
Spezielle Zeichenkombinationen *
Wir haben nun schon über die lexikalische Einheit »--« gesprochen und erfahren, daß zwei einzelne Minuszeichen »-« durch Leerraum getrennt werden müssen, wenn sie nicht als die spezielle lexikalische Einheit »--« interpretiert werden sollen. Es gibt einige solcher spezieller Zeichenkombinationen, die eine besondere Bedeutung haben.
An dieser Stelle listen wir nun spezielle Zeichenkombinationen auf, die keine Wörter oder Literale sind und aus mindestens zwei Zeichen bestehen. Darunter finden wir beispielsweise auch wieder die lexikalische Einheit »--«. Als ein Sonderzeichen sehen wir in diesem Abschnitt ein Zeichen an, das in einer der unten aufgelisteten speziellen Zeichenkombinationen vorkommt.
In einem Programm sind Sonderzeichen durch Leerraum zu trennen, wenn sie sonst eine der im folgenden aufgelisteten speziellen Zeichenkombinationen bilden würden, aber diese nicht geschrieben werden soll.
Will man beispielsweise zwei Plus-Vorzeichen »+« hintereinander schreiben, so kann man der Auflistung entnehmen, daß so die spezielle lexikalische Einheit »++« entstehen würde. Um dies zu vermeiden, sind Zeichen, die zwei einzelne Plus-Vorzeichen »+« sein sollen, mit einem Leerraum voneinander getrennt zu schreiben.
Will man aber zwei runde Klammern »(« hintereinander schreiben, so kann man der Auflistung entnehmen, daß es keine spezielle lexikalische Einheit »((« gibt. Deswegen können diese beiden Zeichen direkt hintereinander geschrieben werden und bleiben doch jeweils einzelne lexikalische Einheiten.
Um die obige Regel anzuwenden, ist es nicht nötig, zu wissen, was all diese speziellen Zeichenkombinationen bedeuten. Einige von ihnen werden aber in späteren Lektionen vorgestellt werden.
Im Zweifel kann man immer ein Leerzeichen vor und hinter jede lexikalische Einheit schreiben, wenn verhindert werden soll, daß sie mit benachbarten Zeichen zu einer speziellen Zeichenkombinationen verschmilzt.
- Spezielle Zeichenkombinationen
!=
##
%:
%:%:
%=
%>
&&
&=
*=
++
+=
--
-=
->
...
/*
//
/=
:>
<%
<:
<<
<<=
<=
==
>=
>>
>>=
^=
|=
||