Forum: Compiler & IDEs Komisches Verhalten von printf


von Yaro (Gast)


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

von Yaro (Gast)


Lesenswert?

Ups....falsches unterforum......
Ich poste das lieber in "Pc-programmierung"....
Kann man Beiträge löschen?

sorry....

von Hc Z. (mizch)


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?

von g457 (Gast)


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 ;-)

von Yaro (Gast)


Lesenswert?

Das Problem ist ja, dass mein Compiler nicht mal gemeckert hat...
Hab wohl einen zu alten...

aber naja, dann hat sich das ja wohl geklärt.

Gruß, Yaro

von Rolf Magnus (Gast)


Lesenswert?

> Das Problem ist ja, dass mein Compiler nicht mal gemeckert hat...

Kein GCC? Oder Warnungen nicht eingeschaltet?

von Yaro (Gast)


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).

von Yaro (Gast)


Lesenswert?

Hab es jetzt!
Musste bei den zusätzlichen kommandozeilen-Optionen -Wall hinzufügen, um 
Warnungen anzustellen.

Vielen Dank für eure Hilfe!
Gruß, Yaro

von Rolf Magnus (Gast)


Lesenswert?

Also doch Warnungen nicht eingeschaltet. Wenn du dabei bist, schalt noch
-pedantic und -Wextra dazu.

von Yaro (Gast)


Lesenswert?

Mach ich =)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.