2009-10-27 16 views
9
#include <stdio.h> 

int main() 
{ 
    float a = 5; 
    printf("%d", a); 
    return 0; 
} 

Dadurch wird die Ausgabe gibt:printf angeben Integer-Format-String für float

0 

Warum ist der Ausgang Null?

+0

Verwenden Sie die Codeformatierung. – Ree

+0

'#include ' entfernt, weil nicht benötigt - andere Aufräumarbeiten auch. –

Antwort

13

Es wird nicht 5 gedruckt, da der Compiler nicht automatisch in eine Ganzzahl umwandeln kann. Sie müssen (int)a selbst tun.

heißt,

#include<stdio.h> 
void main() 
{ 
float a=5; 
printf("%d",(int)a); 
} 

richtig zu sagen gibt 5.

das Programm vergleichen mit

#include<stdio.h> 
void print_int(int x) 
{ 
printf("%d\n", x); 
} 
void main() 
{ 
float a=5; 
print_int(a); 
} 

wo der Compiler die Schwimmer in einen int zu werfen, direkt weiß aufgrund die Erklärung von print_int.

+0

Insbesondere ist es nicht bekannt, automatisch auf eine ganze Zahl in einer Variadic-Funktion zu werfen, aber das ist dem Anfänger ziemlich schwer zu erklären, zumal es sicher aussieht, dass der C-Compiler die beteiligten Typen kennen sollte. –

+1

Neben der Varianz muss der Compiler beim Analysieren des zu übersetzenden Typs die Zeichenfolge analysieren, die an printf übergeben wird, und daraus ableiten, welcher Typ a sein soll. GCC kann leicht eine Konstante "% d \ n" verarbeiten und warnt Sie, wenn Sie "-Wall" übergeben haben, aber viel Glück, wenn die Zeichenfolge nicht fest im Programm codiert ist! –

+0

@MarkRushakoff Angemessene Programmierer verwenden keine nichtkonstanten Formatzeichenfolgen, da sie ein Sicherheitsproblem darstellen. –

12

%d Formatspezifizierer kann nur mit Werten des Typs int verwendet werden. Sie übergeben eine double (die implizit in float konvertiert wird). Das resultierende Verhalten ist nicht definiert. Es gibt keine Antwort auf "warum druckt 0?" Frage. Alles kann gedruckt werden. In der Tat kann alles passieren.

P.S.

  1. Das ist int main, nicht void main.
  2. Es gibt keine solche Header als conio.h in Standard C
+1

+1 für den Hinweis, dass printf() ein Double übergeben wird. Ich habe den Code korrigiert, um überflüssige und irrelevante '#include ' zu entfernen. –

4

Sie wollen werde% f verwenden, um einen Float-Wert für den Druck.

zB

float a=5; 
printf("%f",a); 
5

Sie es entweder in einen int werfen sollten% d zu verwenden, oder einen Format-String verwenden, um den Schwimmer ohne Dezimalgenauigkeit anzuzeigen:

void main() { 
    float a=5; 
    printf("%d",(int)a); // This casts to int, which will make this work 
    printf("%.0f",a); // This displays with no decimal precision 
} 
5

Sie verwenden müssen %f statt %d-%d ist nur für ganze Zahlen, während %f für Floating-Point ist:

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    float a=5; 
    printf("%f",a); 
} 
1

Wie die anderen Leute sagten, müssen Sie %f im Format string verwenden oder a in ein int konvertieren.

Aber ich möchte darauf hinweisen, dass Ihr Compiler, wahrscheinlich, weiß über printf() 's Formatzeichenfolge und kann Ihnen sagen, dass Sie es falsch verwenden.Mein Compiler, mit dem entsprechenden Aufruf (-Wall enthält -Wformat), sagt dieser:

$ /usr/bin/gcc -Wformat tmp.c 
tmp.c: In function ‘main’: 
tmp.c:4: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’ 

$ /usr/bin/gcc -Wall tmp.c 
tmp.c: In function ‘main’: 
tmp.c:4: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘double’ 

$ 

Oh, und noch etwas: Sie sollten ‚\ n‘ enthalten im printf() die Ausgabe zu gewährleisten, wird an das Ausgabegerät gesendet .

printf("%d\n", a); 
/*  ^^ */ 

oder verwenden fflush(stdout); nach dem printf().