Komisches Verhalten von printf

Gast #1576734
Lesenswert?

Hallo Leute,
ich bin beim programmieren zufällig auf folgendes Problem gestoßen:
Beim Ausführen dieses Codes
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4

5
int var;
6

7
int main( ){
8

9
  printf("%f\n", 2345.0f);
10

11
  var = 6;
12
  printf("%f\n", var);
13
  printf("%i\n", var);
14

15

16
  system("PAUSE");
17
  return 0;
18

19
}

kommt das unerwartete Ergebniss: 2345 \n 2345 \n 6    raus. Eigentlich 
hätte ich 2345 \n 0 \n 6   oder ähnliches erwartet.
Wie kommt soetwas?

Gruß, Yaro
#1576750
Lesenswert?

Bei
1
  printf("%f\n", var);
wobei var ein int ist, ist das Ergebnis undefiniert, es kann alles 
passieren.  Auch dass die CPU ihre Elektronen in Marsch setzt, um den 
Stecker zu ziehen.

Aber auch 2345 ist schon ein schönes undefiniertes Ergebnis.  Was willst 
Du mehr?
Gast #1576759
Lesenswert?

Hättest Du mal die Warnings gelesen, die Dir der Compiler auspuckt, da 
steht die Lösung:
1
$ gcc -Wall printf-test.c -o printf-test
2
printf-test.c: In function ‘main’:
3
printf-test.c:10: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘int’

Das Verhalten von printf ist dadurch dadort undefiniert, da könnte 
genausogut Grützewütze bei rauskommen. Wenn man aber - die Warnung 
behebend - den Code auf
1
printf("%f\n", (double)var);
ändert, dann kommt auch die erwartete Ausgabe
1
2345.000000
2
6.000000
3
6

HTH und HF und Du hast hoffentlich was daraus gelernt [1] :-)

[1] Lerninhalt: -Wall regelt, der Compiler meckert fast immer Zurecht 
und gibt manchmal sogar die richtige Fehlerstelle mit an ;-)
Gast #1576816
Lesenswert?

Doch... GCC... Warnungen eingeschaltet...

Habe jetzt aber nochmal geguckt, der zeigt mir tatsächlich keine 
Warnungen an. Benutze wx-Dev-Cpp zum programmieren auf dem PC, 
normalerweise programmiere ich Mikrocontroller (mit Code Blocks).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren