2012-08-15 89 views
0

以下程序應該讀取一個float值,然後打印一個整數。但是當我運行它時,它不打印整數。而是打印出我在scanf中輸入的值。 任何人都可以解釋輸出?printf打印由scanf讀取的float而不是整數參數

#include<stdio.h> 
void main() 
{ 
    long x; 
    float t; 
    scanf("%f",&t); 
    printf("%d\n",t); 
    x=90; 
    printf("%f\n",x); 
    { 
     x=1; 
     printf("%f\n",x); 
     { 
      x=30; 
      printf("%f\n",x); 
     } 
    x=9; 
    printf("%f\n",x); 
    } 
} 
+0

是的,我們能做到。但我們不會因爲你在錯誤的地方問這個問題。請在CodeReview上提問。 – 2012-08-15 13:17:12

+1

您是否查找了正在使用的函數的文檔?你不明白什麼? – moooeeeep 2012-08-15 13:17:14

+0

不確定你的意思。但是,您正在使用浮點格式打印出一個長變量並且無法正常工作。打印x時使用%d而不是%f。 – 2012-08-15 13:17:26

回答

0

x是一個長整數,但您將其打印爲浮點數。而t是一個浮點數,但是你將它打印爲一個整數。在printf調用中切換%d和%f格式說明符。

3

t具有類型float,所以printf("%d\n",t)調用未定義行爲,由於%d預計int類型的參數。任何事情都可能發生。 (同樣是的printf("%f\n",x)真:%f期望一個double,但x類型是long int。)

予一次回答的那些情況下in detail之一;也許這有些興趣。結果是,在實踐中,您可以通過研究IEEE754浮點數的解剖結構以及瞭解平臺上整型的大小來解釋觀察到的行爲。

1

印刷int變量時,這樣你應該使用%d

printf("%ld", x); 

您正在使用%f

+2

我會說printf(「%ld」,x); – besworland 2012-08-15 13:21:13

+1

既然它很長,是的,你是對的。感謝您的澄清!將更新。 – 2012-08-15 14:00:01

1
printf("%f\n",x); 

x具有類型long,但%f轉換器需要一個浮點值(double類型)。通常,當您將一個整數傳遞給需要浮點值的函數時,該值將被靜默轉換。但是,這僅適用於具有固定數量參數的函數以及指示每個參數類型的原型。它不適用於可變參數函數,如printf,因爲編譯器沒有足夠的信息來知道將值轉換爲:格式字符串只能在運行時進行分析。

語言規範留下了這個程序的行爲未定義:它可以做任何事情。在這種情況下可能發生的情況是x存儲在某個整數寄存器中,並且f存儲在某個浮點寄存器中。由於printf調用正在尋找一個浮點值,因此編譯後的代碼會查找第一個浮點寄存器。如果您將浮點值傳遞給printf,則該參數將會在該寄存器中結束。但是你沒有,所以該寄存器中的值是存儲在那裏的最後一個值:由scanf讀取的值。

一個好的編譯器會警告你你做錯了什麼。例如,這裏就是我得到的,當我與gcc -O -Wall編譯代碼:

a.c:2: warning: return type of 'main' is not 'int' 
a.c: In function 'main': 
a.c:7: warning: format '%d' expects type 'int', but argument 2 has type 'double' 
a.c:9: warning: format '%f' expects type 'double', but argument 2 has type 'long int' 
a.c:12: warning: format '%f' expects type 'double', but argument 2 has type 'long int' 
a.c:15: warning: format '%f' expects type 'double', but argument 2 has type 'long int' 
a.c:18: warning: format '%f' expects type 'double', but argument 2 has type 'long int' 

,我建議配置您的編譯器打印這樣的警告,並關注他們。

爲了使程序正常工作,可以在需要的時候傳遞一個浮點值,或者告訴printf期望一個整數值。無論是

printf("%f", (double)x); 

printf("%ld", x);