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

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

這使輸出整數格式字符串:的printf指定浮動

0 

爲什麼輸出爲零?

+0

使用代碼格式。 – Ree 2009-10-27 16:35:02

+0

'#include '因爲不需要而被移除 - 其他清理也一樣。 – 2009-10-27 17:01:43

回答

13

它不打印5,因爲編譯器不知道自動轉換爲整數。你需要自己做(int)a

也就是說,

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

正確輸出5.

比較該程序與

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

編譯器在其中直接知道到浮子轉換爲int,由於聲明print_int

+0

具體而言,它不知道自動轉換爲可變參數函數中的整數,但這對於初學者來說很難解釋,特別是因爲它確實看起來像C編譯器應該知道涉及的類型。 – 2009-10-27 17:18:29

+1

除了可變性之外,知道要轉換什麼類型將需要編譯器解析傳遞給printf的字符串,並推導出a應該是什麼類型。 GCC可以輕鬆處理常量「%d \ n」,並在通過'-Wall'時發出警告,但如果字符串沒有被硬編碼到程序中,祝您好運! – 2009-10-27 19:05:46

+0

@MarkRushakoff合理的程序員不使用非常量格式的字符串,因爲它們引入了一個安全問題。 – 2013-10-20 09:44:25

12

%d格式說明符只能用於類型爲int的值。您傳遞的是double(其中float將隱式轉換爲)。結果的行爲是未定義的。沒有答案「爲什麼它打印0?」題。任何東西都可以打印。事實上,任何事情都可能發生。

P.S.

  1. 這就是int main而不是void main
  2. 有作爲conio.h標準C.
+1

+1指出printf()傳遞了一個double。我修復了代碼以刪除多餘和不相關的'#include '。 – 2009-10-27 17:02:51

4

沒有這樣的標題,您需要使用%F用於打印的浮點值。

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

您應該將它轉換爲int使用%d,或使用格式字符串顯示浮動不帶小數精度:

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

您需要使用%f而不是%d - %d僅用於整數,而%f用於浮點:

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

正如其他人所說,您需要在格式字符串中使用%f或將a轉換爲int。

但是我想指出你的編譯器可能知道printf()的格式字符串,並且可以告訴你你錯誤地使用了它。我的編譯器,用適當的調用(-Wall包括-Wformat),這樣說:

$ /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’ 

$ 

哦,還有一兩件事:你應該包括「\ n」在printf(),保證輸出發送到輸出設備。

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

printf()使用後fflush(stdout);