Der ternäre Operator in C [] (Der ternäre Operator in C), Lektion, Seite 722991
https://www.purl.org/stefan_ram/pub/ternaerer_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C-Kurs

Die Auswertung der weiteren  Operanden des ternären Operators in C 

Syntax

Hier geben wir das schon gezeigte Syntaxdiagramm erneut wieder.

Syntaxdiagramm (vereinfacht)
Ausdruck
.----------. .-. .----------. .-. .----------.
--->| Ausdruck |--->( ? )-->| Ausdruck |--->( : )-->| Ausdruck |--->
'----------' '-' '----------' '-' '----------'

Semantik

Bei der Auswertung eines Ausdrucks dieser Art wird zunächst der erste  Operand ausgewertet.

Es werden als stets nur zwei  der drei in einem ?-Ausdruck enthaltenen Ausdrücke ausgewertet: Der vor dem Fragezeichen und einer der beiden  hinter dem Fragezeichen.

vereinfachte Darstellung der Entscheidung
             Ausdruck ?
.
wenn | wenn
nicht 0 .--------'--------. 0
| |
' '
Ausdruck : Ausdruck

Falls der erste Operand ein Zeichenfolgenliteral ist, wird immer der zweite Operand ausgewertet.

Beispiel zum ternären Operator

Das folgende Beispiel zeigt, wie der Ausdruck links  vom Doppelpunkt nur dann ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen nicht  gleich »0« ist.

main.c

#include <stdio.h>

int main( void )
{ 0 ? puts( "alpha" ): 0;
1 ? puts( "gamma" ): 0; }

stdout
gamma

Der Ausdruck wird also nur unter einer bestimmten Bedingung ausgewertet – er wird bedingt  ausgewertet.

Wir können den ternären Operator also einsetzen, um einen Ausdruck nur unter einer bestimmten Bedingung  auswerten zu lassen, er erlaubt uns also eine bedingte Auswertung.

Beispiel zum ternären Operator (1)

Das folgende Beispiel zeigt, wie der Ausdruck rechts  vom Doppelpunkt nur dann ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen gleich  »0« ist.

main.c

#include <stdio.h>

int main( void )
{ 0 ? 0 : puts( "alpha" );
1 ? 0 : puts( "gamma" ); }

stdout
alpha

Beispiel zum ternären Operator (2)

Das folgende Beispiel zeigt, wie der Ausdruck links  vom Doppelpunkt genau dann ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen nicht  gleich »0« ist, und der Ausdruck links  vom Doppelpunkt genau dann ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen gleich  »0« ist.

main.c

#include <stdio.h>

int main( void )
{ 0 ? puts( "alpha" ): puts( "gamma" );
1 ? puts( "delta" ): puts( "theta" ); }

stdout
gamma
delta

Zuweisungen als gesteuerte Ausdrücke

Das folgende Beispiel zeigt, die Wirkungen von Zuweisungsoperationen durch den ?-Ausdruck gesteuert werden können.

main.c

#include <stdio.h>

int main( void )
{ int x = -1;
int y = -1;

0 ? x = 0 :( y = 0 );
1 ? x = 1 :( y = 1 );

printf( "x = %d,\n", x );
printf( "y = %d.\n", y ); }

stdout
x = 1,
y = 0.

Aufgrund einer etwas komplizierten Regelung kann man die Priorität des ?-Operators nicht auf einfache Weise angeben, sondern muß die genauen Regeln zur Interpretation von Ausdrücken der Spezifikation der Programmiersprache entnehmen. Diese genauen Regeln sollen an dieser Stelle dieses Kurses noch nicht behandelt werden. Die Priorität dieses Operators kann als schwächer als die der meisten Operatoren angesehen werden und ähnelt der des Zuweisungsoperators. Daher sind besonders die Kombinationen mit dem Zuweisungsoperator schwierig. Hier können dann im Zweifelsfall Klammern verwendet werden.

Der Ausdruck »0 ? x = 0 : y = 0« wird als »( 0 ? x = 0 : y )= 0« interpretiert, weswegen die oben verwendeten Klammern nötig sind.

Der oben verwendete Ausdruck »0 ? x = 0 :( y = 0 )« bedeutet »0 ?( x = 0 ):( y = 0 )«.

Übungsfragen

?   Übungsfrage

Welche Ausgabe erzeugt das folgende Programm?

main.c

#include <stdio.h>

int main( void )
{ 1 ? printf( "A\n" ): 0;
0 ? printf( "B\n" ): 0; }

?   Übungsfrage

Welche Ausgabe erzeugt das folgende Programm?

main.c

#include <stdio.h>

int main( void )
{ -7 ? printf( "A\n" ): 0;
+0 ? printf( "B\n" ): 0;
+3 ? printf( "C\n" ): 0; }

?   Übungsfrage

Die Funktion »printf« gibt in der Regel die Anzahl der von diesem Aufruf ausgegebenen Zeichen zurück. Welche Ausgabe erzeugt demnach das folgende Programm?

main.c

#include <stdio.h>

int main( void )
{ printf( "A" )? printf( "B\n" ): 0;
printf( "" )? printf( "C\n" ): 0; }

Zeichenfolgenliterale als Steuerausdrücke *

Das folgende Beispiel zeigt, daß der Ausdruck links vom Doppelpunkt immer  ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen eine Zeichenfolge als Wert hat.

main.c

#include <stdio.h>

int main( void )
{ "" ? puts( "alpha" ): 0;
"a" ? puts( "gamma" ): 0;
"0" ? puts( "delta" ): 0; }

stdout
alpha
gamma
delta

Zeichenfolgenliterale spielen an dieser Stelle allerdings in der Praxis keine Rolle.

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 stefanram722991 stefan_ram:722991 Der ternäre Operator in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722991, slrprddef722991, 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/ternaerer_c