2016-09-25 4 views

Antwort

4

Es gibt keine Inkonsistenz:

f = a/100; 

führt ganzzahlige Teilung in einem Schwimmer gelagert: Ergebnis 1.0

dann

printf(" %f ",a/100); 

druckt eine ganze Zahl (1), jedoch mit Schwimmers Format: undefiniertes Verhalten.

das funktioniert ohne Überraschungen:

void main() 
{ 
    int a = -150; 
    float f; 
    f = a/100.0; 
    printf(" %f,%f ",f,a/100.0); 
} 

printf ist eine Variable Argument Funktion (Prototyp: void printf(const char *,...)), die keine andere Wahl hat, als zu „glauben“ das Format, das Sie weitergeben.

Wenn Sie printf sagen, dass zweites Argument ein Schwimmer ist, dann wird es das Argument Bytestrom als float zu lesen, und wenn die Daten nicht float Struktur überein, na ja, es wird nicht richtig funktionieren.

EDIT: Compiler-Hersteller wissen, dass dies ein häufiger Fehler ist, so haben sie eine spezielle Prüfung für die printf-ähnliche Funktionen hinzugefügt: Wenn Sie Ihre Datei mit gcc mit -Wall oder -Wformat Optionen kompilieren, erhalten Sie die folgende explizite Nachricht :

foo.c:8:1: warning: format '%f' expects argument of type 'double', but argument 3 has type 'int' [-Wformat=] 
printf(" %f,%f ",f,150/100); 

(gleiches gilt, wenn die Anzahl der % -ähnlichen Format Argumente und die Anzahl der Argumente nicht übereinstimmen).

+0

Also, ich sollte nicht% f mit einer zugrunde liegenden Ganzzahl verwenden, wenn ich nicht Cast? (Ich möchte nicht 100.0 als Nenner verwenden). Ich wusste, dass es korrekt gedruckt werden würde, wenn die von Ihnen erwähnten Änderungen vorgenommen wurden. MEIN PUNKT IST, WARUM ES NICHT INTHERENTY typecast int zu floaten, wenn% f Formatbezeichner verwendet wird. – Bhargav

+0

@iharob: was habe ich mir gedacht :) bearbeitet. keine Notwendigkeit für weitere Komplexität ... –

+0

@Bhargav siehe meine Bearbeitung. 'printf' kann es nicht wissen. –

Verwandte Themen