printf und Wechselwirkung mit fehlendem cast

08/10/2009 - 16:34 von Robert Hartmann | Report spam
Hallo zusammen,

Gegeben folgender fehlerhafte aber compilierbare Code -
es fehlen ein paar casts.

Ich bin gefragt worden, warum es im Code unten
augenscheinlich ausreicht, jeweils nur die erste
printf-gleitpunkt-Ausgabe mit korrektem cast
durch zuführen und bei der jeweils zweiten
den cast wegzulassen und trotzdem das erwartete
Ergebnis lesen zu können.

Und die nàchste Frage ist:

Wieso man, wenn die a-Fàlle mit korrekten casts ausgestattet sind
und die b-Fàlle nicht kastet, das selbe Ergebnis für b wie bei a bekommt.

Gruß Robert

P.S. Ich würde mich zur Erklàrung des Verhaltens ungerne auf
"Da muss du eben den Cast machen, sonst ist es einfach falsch
mit unsicherem Ergebnis" zurückziehen.



#include <stdio.h>

int main(int argc, char** argv ) {

int a3;
int b=-7;

printf("a als Zeichen: %c", a);
printf("a als vorzeichenlose Ganzahl: %u", a);
printf("a als Hexadezimalzahl: %x", a);
printf("a als vorzeichenbehaftete Ganzzahl: %d ", a);
printf("Gleitpunktzahl einfache Genauigkeit 2 Nachkommastellen
%.2f",(float)a);
printf("Gleitpunktzahl doppelte Genauigkeit exponent. Darst. %E",a);

printf(" ");

printf("b als Zeichen: %c", b);
printf("b als vorzeichenlose Ganzahl: %u", b);
printf("b als Hexadezimalzahl: %x", b);
printf("b als vorzeichenbehaftete Ganzzahl: %d ", b);
printf("Gleitpunktzahl einfache Genauigkeit 2 Nachkommastellen
%.2f",(float)b);
printf("Gleitpunktzahl doppelte Genauigkeit exponent. Darst. %E",b);


return 0;
}
 

Lesen sie die antworten

#1 Rainer Weikusat
08/10/2009 - 17:14 | Warnen spam
Robert Hartmann writes:
Gegeben folgender fehlerhafte aber compilierbare Code -
es fehlen ein paar casts.

Ich bin gefragt worden, warum es im Code unten
augenscheinlich ausreicht, jeweils nur die erste
printf-gleitpunkt-Ausgabe mit korrektem cast
durch zuführen und bei der jeweils zweiten
den cast wegzulassen und trotzdem das erwartete
Ergebnis lesen zu können.



Um das herauszufinden, wirst Du analysieren muessen, was die
printf-Implementierung, die Du benutzt hast, in diesen Faellen tut.
Mit C hat das allerdings nichts zu tun.

[...]

P.S. Ich würde mich zur Erklàrung des Verhaltens ungerne auf
"Da muss du eben den Cast machen, sonst ist es einfach falsch
mit unsicherem Ergebnis" zurückziehen.



Das ist aber genau die Antwort auf Deine Frage. So, wie der Code
in Deinem Posting steht, ist sein Verhalten undefiniert, weil die
Typen der Argumente nach Anwendung der 'integer promotions' zT nicht
denen entsprechen, die Argument fuer die entsprechenden 'conversion
specifier' haben sollen. Um es mal mit einen Beispiel zu versuchen:


?aufgebaut so nicht Deutschen im Saetze werden Warum

Schliesslich 'funktioniert' das doch auch und ueberhaupt handelt
sich bloss um von n denkbaren, grundsaetzlich willkuerlichen
Konventionen. Genauso willkuerlich wie die Konvention, nach der

2 + 7 = 9

eine wahre Aussage darstellt.

Ähnliche fragen