2017-06-09 35 views
-1

當我運行此代碼時,D的輸出作爲值C出現。是因爲我要求一個浮點數,它只是在內存中使用最近的浮點數?當我不匹配格式說明符時,爲什麼我會收到另一個變量的值?

#include <stdio.h> 

int main() 
{ 
    int a=3/2; 
    printf("The value of 3/2 is : %d\n", a); 

    float b=3.0/2; 
    printf("The value of 3/2 is : %f\n", b); 

    float c=7.0/2;         <------- 
    printf("The value of 3/2 is : %f\n", c); 

    int d=3.0/2; 
    printf("The value of 3/2 is : %f\n", d);  <------- 

    return 0; 
} 

The value of 3/2 is : 1 
The value of 3/2 is : 1.500000 
The value of 3/2 is : 3.500000 
The value of 3/2 is : 3.500000 
+9

未定義的行爲未定義。 –

+2

我想你是在x64平臺上 –

+0

@ M.M:你的意思是因爲在64位浮點數值通過SSE寄存器傳入,那麼'3.5'仍然是該寄存器中的值? –

回答

2

不匹配的格式說明符產生不確定的行爲表示類型參數(參見,例如,cppreference/printf):

...如果任何參數不是相應轉換說明符預期的類型 ,或者如果格式要求的參數數量少於 ,則行爲是未定義的。

未定義的行爲是未定義的;它可能會崩潰,它可能不會打印任何東西,甚至看起來正確的東西。賦予例如,在本online c draft standard的未定義行爲定義:

3.4.3(1)未定義的行爲

行爲,在使用非便攜式的或錯誤的程序構建體或錯誤數據的 ,對於該國際標準規定不要求 要求注意可能存在未定義的行爲範圍,從完全忽略 情況完全具有不可預知的結果,到 以文檔化方式執行的行爲 環境特徵(有或沒有發佈診斷 消息),以終止翻譯或執行(伴隨診斷消息的發行 )。

2

printf函數可以訪問與您指定的格式相匹配的內存量;如果你沒有提供足夠的,行爲是undefined並落在依賴編譯器和隨機之間。

可能它會讀取給定地址之後的任何內存,並且因爲浮點數位於不同的字節邊界上,所以可以獲取其他變量所在的位置。另一個編譯器或輕微的代碼更改會給出不同的結果分析'未定義的行爲'是沒有意義的。

相關問題