Die Ausdruckklammern in C (Die Ausdruckklammern in C), Lektion, Seite 722917
https://www.purl.org/stefan_ram/pub/ausdruckklammern_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C-Kurs

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
!=
##
%:
%:%:
%=
%>
&&
&=
*=
++
+=
--
-=
->
...
/*
//
/=
:>
<%
<:
<<
<<=
<=
==
>=
>>
>>=
^=
|=
||

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722917 stefan_ram:722917 Die Ausdruckklammern in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722917, slrprddef722917, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/ausdruckklammern_c