Du musst eine Entscheidung treffen, ob es sich um März oder April handelt. Wie auch immer.
Code: Alles auswählen
int tag = 52; // 52. März
char const monatsname[]={ "März", "April" };
printf( "Ostersonntag ist am %d. %s\n", (tag % 31), monatsname[tag > 31] );
Das ist aber getrickst, weil die Entscheidung hier dadurch zu stande kommt, dass das Boolean als 0 (falsch) oder 1 (wahr) interpretiert wird und dieser Wert dann als Index für das Array Monatsname missbraucht wird.
Ohne diesen Hack
Code: Alles auswählen
int tag = 52; // 52. März
char const monatsname[]={ "März", "April" };
printf( "Ostersonntag ist am %d. %s\n", (tag % 31), monatsname[ tag / 31 ] );
ist das semantisch sauber, aber sollte Ostern auf den 63. März fallen, dann ist das der 2. Monat nach März und den gibt's nicht. Ergo fliegt das Programm Dir um die Ohren. Das kann man akzeptieren, wenn man der Shit-In-Shit-Out-Philosophie folgt: Wer behauptet, Ostern liegt im Mai muss sich nicht wundern, wenn die Welt untergeht.
Mit tag/31 einen Index zu berechnen und demzufolge eine Adresse zu bestimmen ist aber am Ende eine Entscheidung, die dem ?:-Operator gleichwertig ist.
Auch beim If geht es am Ende nur darum, eine von zwei Adressen zu bestimmen. Dann nicht um den Beginn des Strings "März" oder "April", sondern wo das Programm fortgesetzt wird.
Der ternäre Operator ist kein If-Ersatz, denn er verändert nicht den Ablauf des Programms. Es findet keine Verzweigung statt, es geht immer hinter dem ?:-Operator weiter. Ob er vergleichbar zu if implementiert wird, oder vergleichbar damit, den boolischen Wert als Index zu sehen, ist Sache des Compilers.
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.