? : operatoren

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
schlafmütze
Beiträge: 67
Registriert: Mi Mär 11, 2009 6:48 pm

? : operatoren

Beitrag von schlafmütze » Sa Mär 14, 2009 6:09 pm

Man siehst sich wieder proggen.org :)

Code: Alles auswählen

#include<stdio.h>
int main(void)
   {
    int i = 700 / 3;
    int j = 'z' - 'a'; 
    int k = i > j;
    int b = 8;
    int m = b>10 ? 7 : b > 5 ? 2 : 4;
    if (0 < i < 100) 
    {printf("passt\n");}
    else 
    {printf("passt nicht\n");}
    

    printf("%d, %d,%d,%d\n", i, j, k , m);
    return 0;
}
Ich habe wieder ein Problem eine Zeile im Programm nicht zu verstehen. :roll:

Code: Alles auswählen

  int m = b>10 ? 7 : b > 5 ? 2 : 4;
Kann mir vielleicht jemand erklären was diese auf sich hat und diese komischen Frage und division Zeichen verstehe ich nicht.

Danke im voraus.

mfg schlafmütze

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: ? : operatoren

Beitrag von fat-lobyte » Sa Mär 14, 2009 7:04 pm

Dieser Operator heißt auf Englisch "conditional operator", was ins deutsche übersetzt sowas wie "bedingter operator" oder so ähnlich heißt.

Die Syntax lautet wie folgt:

<bedingung> ? <ausdruck1> : <ausdruck2>

Wobei <bedingung> ein "zu bool konvertierbarer Ausdruck", also auf deutsch wahr oder falsch sein muss, und <ausdruck1> und <ausdruck2> ein Ausdruck sein müssen.

Was er tut:

Wenn <bedingung> wahr ist, gibt dieser Operator <ausdruck1> zurück, wenn die Bedingung falsch ist, gibt er <ausdruck2> zurück.

Beispiel:

Code: Alles auswählen

int seven_is_good = 0;
int var;

var = seven_is_good ? 7 : 3; /* var ist jetzt 3 */

seven_is_good = 1;
var = seven_is_good ? 7 : 3; /* var ist jetzt 7 */
Soweit die üblichen Anwendungsfälle.

Dein beispiel könnte man also so übersetzen:

Code: Alles auswählen

#include <stdio.h>

int main()
{
    int b = 11;
    int m = b>10 ? 7 : b > 5 ? 2 : 4;
    
    int n;
    
    if (b>10)
        n = 7;
    else
    {
        if (b > 5)
            n = 2;
        else
            n = 4;
    }
    
    printf ("m ist %d\n", m);
    printf ("n ist %d\n", m);
    
    return 0;
}

Eine kleine Feinheit:
<ausdruck1> oder <ausdruck2> muss keineswegs eine einziger Ausdruck sein, du kannst auch ausdrücke mit dem "Komma-Operator" verknüpfen. Der Rückgabewert des Kommaoperators ist der letzte Ausdruck.
Beispiel:

Code: Alles auswählen

#include <stdio.h>

int main()
{
    int a=1, b, c;
    
    c = 0 ? 2 : (a++, b = 33, 12);
    
    printf ("a ist %d\n", a); /* a ist 2 */
    printf ("b ist %d\n", b); /* b ist 33  */
    printf ("c ist %d\n", c); /* c ist 12 */
    
    return 0;
}
Zu beachten ist, das man den Komma operator in Klammern setzen muss, weil er eine niedrigere Precedence hat als der ?: operator.
Das sieht etwas verwirrend aus, ist es aber in Wirklichkeit gar nicht.

Erwähnt sein noch, dass es wegen der schlechten Lesbarkeit (und wegen des fehlenden "Bekanntheitsgrades") oft besser ist auf diesen Operator zu verzichten.

In diesem Sinne,
fröhliches conditional operating ;-)

mfg, fat-lobyte
Haters gonna hate, potatoes gonna potate.

schlafmütze
Beiträge: 67
Registriert: Mi Mär 11, 2009 6:48 pm

Re: ? : operatoren

Beitrag von schlafmütze » Sa Mär 14, 2009 7:22 pm

Erwähnt sein noch, dass es wegen der schlechten Lesbarkeit (und wegen des fehlenden "Bekanntheitsgrades") oft besser ist auf diesen Operator zu verzichten.
Da bin ich aufjedenfall einer Meinung. :o

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: ? : operatoren

Beitrag von Xin » Sa Mär 14, 2009 8:09 pm

schlafmütze hat geschrieben:
Erwähnt sein noch, dass es wegen der schlechten Lesbarkeit (und wegen des fehlenden "Bekanntheitsgrades") oft besser ist auf diesen Operator zu verzichten.
Da bin ich aufjedenfall einer Meinung. :o
Ich nicht... wie immer kommt es darauf an, ob man den Operator brauchbar verwendet. So sieht sowas bei mir aus.

Code: Alles auswählen

int wert = (bedingung )
         ? value_true
         : value_false;
Für eine unleserliche Kombination von Operatoren brauche ich den ?: nicht unbedingt.

@fat-lobyte: Wenn du so ausführlich antwortest, dann mach doch eine Wiki-Seite draus und poste den Link.... aber
fat-lobyte hat geschrieben:

Code: Alles auswählen

c = 0 ? 2 : (a++, b = 33, 12)
...die Verwirrung mit dem Kommaoperator zu vergrößern hilft nicht unbedingt, den ?!-Operator zu erklären ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: ? : operatoren

Beitrag von fat-lobyte » Sa Mär 14, 2009 10:06 pm

Xin hat geschrieben:@fat-lobyte: Wenn du so ausführlich antwortest, dann mach doch eine Wiki-Seite draus und poste den Link....
http://tutorial.proggen.org/doku.php?id ... onditional
Xin hat geschrieben:

Code: Alles auswählen

int wert = (bedingung )
         ? value_true
         : value_false;
Das habe ich übrigens auch noch eingebaut.

Xin hat geschrieben:...die Verwirrung mit dem Kommaoperator zu vergrößern hilft nicht unbedingt, den ?!-Operator zu erklären ^^
Da ist was wahres dran... Ich habe das Beispiel gebracht weil ich das erst kürzlich in einem anderen Zusammenhang herausgefunden habe. Ich habe übrigens noch einen Artikel zum Kommaoperator erstellt:
http://tutorial.proggen.org/doku.php?id ... maoperator
Haters gonna hate, potatoes gonna potate.

Antworten