main(){
printf("%d %d",1234.5);
}
輸出:0 1083394560默認參數促進
這是浮動變量被當作雙然後第一%d
顯示0和其他一個的默認參數推廣的情況下顯示的其餘4個字節的值,即1083394560 。
我的問題是,如果%d
讀取前4個字節那麼請問這個程序
main()
{
printf("%f",1234.5);
}
給個e正確的輸出。因爲float也是4個字節,它也應該像%d
一樣。
main(){
printf("%d %d",1234.5);
}
輸出:0 1083394560默認參數促進
這是浮動變量被當作雙然後第一%d
顯示0和其他一個的默認參數推廣的情況下顯示的其餘4個字節的值,即1083394560 。
我的問題是,如果%d
讀取前4個字節那麼請問這個程序
main()
{
printf("%f",1234.5);
}
給個e正確的輸出。因爲float也是4個字節,它也應該像%d
一樣。
咦? %f
可以「知道」作爲可變參數已被提升爲更大的東西(double
),並據此採取相應行動。 %d
的代碼不知道它應該期望升級的浮點值;它期望(適當提升)int
。
好的,如果是,然後告訴我在下面的程序: main(){ printf(「%d%f」,4.0,4.0); } 輸出結果爲:0 0.000000 爲什麼? – som
@som:未定義的行爲。你不能推理該代碼。 – Mat
@som儘管它是UB,你可以考慮一下。 '4.0,4.0'在堆棧上有一定的表示 - 當浮點數爲'00 00 80 40 00 00 80 40'時。 '00 00 00 00 00 00 10 40 00 00 00 00 00 00 10 40''雙打。 '%d'取'00 00 00 00',以便'%f'得到'00 00 10 40 00 00 00 00',它是'5.31017013e-315'並且被視爲'%f'的'0.0'輸出。 – glglgl
%f
格式字符串在參數列表中取double
值,並將其打印出來。由於在C中未加後綴的浮點文字是double
s,並且雙精度不會被默認的升級規則提升或以其他方式更改,所以第二個示例中沒有任何魔法發生。
你的第一個例子是未定義的行爲,任何事情都可能發生。
C99§7.19.6.1的fprintf
功能
如果對於格式參數不足,行爲是不確定的 。
[...]
如果任何參數是 類型不正確的相應的轉換說明書中,行爲是 未定義。
你自己回答你的問題:
這是浮動變量被當作雙
當然的默認參數提升的情況下,%f
知道這個默認參數促銷只處理double
s,而不處理float
s。
我的意思是說的第二僞碼也shud得到輸出0 – som
以下程序的輸出: 主() { 的printf( 「%d%F」,4.0,4.0); } 輸出:0 0.000000 爲什麼上面的輸出顯示,但我期望它是 0 4.000000 – som
你不能假設「因爲它也是4個字節,它應該表現相同」。一些調用約定將*浮點參數放在*不同位置*中,而不是以整數/指針參數的形式存在,或者以意想不到的方式填充參數。 –