簡體   English   中英

在printf中使用%d來打印浮點值會產生意外的輸出

[英]Use of %d inside printf to print float value gives unexpected output

#include<iostream>
#include<stdio.h.>
using namespace std;
int main()
{
    float f=11.11;
    printf("%d",f);
}

當我在dev c ++中執行以下代碼時,輸​​出為-536870912。 當我在在線教程點編譯器上執行相同的代碼時,每次運行都會得到不同的結果。 可能是什么原因?

如果參數與格式說明符不匹配, 則為undefined behavior 使用%f打印浮點數。

printf("%f",f);

使用良好的編譯器,您應該能夠輕松捕獲此類錯誤。 GCC產生:

warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]

為您的代碼。

PS: stdio.h標頭中包含一個流浪點。

我不確定您是否在問為什么它沒有打印11? 為什么在不同的編譯器下打印出不同的答案?

它沒有打印11的原因是,正如其他答案所解釋的那樣, %d不會打印浮點數,並且在printf調用中,沒有自動轉換來解決傳遞的類型和預期的類型之間的不匹配問題。

而且它在不同的編譯器下打印出不同內容的原因是它是未定義的行為 ,意味着可能發生任何事情。 假設你出去你的車,松開前輪所有lugnuts直到它快要脫落,得到,並降低在高速路上,直到車輪不會脫落,於是你失去控制並撞上溝。 並假設您明天會買一輛新車,做完全一樣的事情,除了偶然地撞倒在一棵樹上。 此時,您可以采用兩種方法:

  1. 試着找出是什么細微的因素導致您在一天之內掉進溝渠,而在另一天又掉進一棵樹。 為什么它沒有更多的可重復性?
  2. 下定決心不要再嘗試這種愚蠢的實驗。

它是浮子,用

printf("%f" , f); 

如果不這樣做,那就是不確定的行為。 要理解,可以嘗試將值-1的int強制轉換為unsigned int。

您將獲得巨大的價值。

此處,轉換說明符和變量的類型不匹配:

  printf("%d",f);

將由格式字符串給定的轉換說明符指定的其他參數傳遞給printf會引發不確定的行為。 從那一刻起,一切都會發生。

要解決此問題,請使用正確的轉換說明符。

對於浮點變量,請使用轉換說明符f ,該轉換符應為double 但是,當將float傳遞給諸如printf的可變函數時, float會提升為double

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM