[英]Printing int variables with float format specifier
int main()
{
int a=5;
float b=7.5;
printf("%d %f\n",a,b);
printf("%d %f\n",a,a);
return 0;
}
當我在gcc編譯器中編譯這個輸出時是
5 7.500000
5 7.500000
但是在視覺工作室中,輸出是
5 7.500000
5 0.000000
我無法理解gcc編譯器輸出。
printf
原型是:
int printf(const char *format, ...);
函數原型聲明符中的省略號表示法導致參數類型轉換在最后聲明的參數之后停止。 默認參數提升是在尾隨參數上執行的。
對每個參數執行整數提升,並將類型為float的參數提升為double。 這些被稱為默認參數促銷。
因此,沒有使用printf
調用執行其他參數提升。 特別是, a
不會轉換為double
。 因此,它會導致一個未定義的行為: printf
將嘗試獲得double
給定大小( sizeof(double)
)和給定的內存表示,這可能是從不同的int
。
fprintf
功能 如果轉換規范無效,則行為未定義。 如果任何參數不是相應轉換規范的正確類型,則行為未定義。
此外,您可以查看gcc生成的ASM代碼,了解正在發生的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.