簡體   English   中英

在整數和浮點數上打印運算結果

[英]Printing the result of operations on integers and floats

考慮以下C程序:

int main() {
    int a =2;
    float b = 2;
    float c = 3;
    int d = 3;
    printf("%d %f %d %f %d %f %d %f\n", a/c, a/c, a/d, a/d, b/c, b/c, b/d, b/d);
    printf("%d\n", a/c);
}

輸出為:

 0 0.666667 0 0.666667 2 0.666667 0 0.666667
 539648

我完全無法理解這一點。 為什么將a / c打印為整數給出0,而將b / c打印給出2? 在涉及浮點數和整數的計算中,不是所有整數都提升為浮點數嗎? 因此,在兩種情況下答案都應為0。

在輸出的第二行中,我只是將a / c打印為整數,由於某種原因,它給出了垃圾值(即使當我在第一個復合printf語句中將其打印為0時,它也會給出垃圾值)。 為什么會這樣呢?

您有未定義的行為:

printf("%d %f %d %f %d %f %d %f\n", a/c, a/c, a/d, a/d, b/c, b/c, b/d, b/d);

printf的格式說明符必須與所提供參數的類型匹配。 由於printf不提供帶有類型的參數列表,而僅提供...除了標准類型轉換外,沒有隱式類型轉換。

如果您有UB,基本上任何事情都可能發生。

可能發生的情況如下:

根據格式說明符, printf從調用參數中消耗一定數量的字節。 此字節數與指定的格式類型匹配。 如果字節數與作為參數傳遞的字節數不匹配,則所有后續參數都不同步。 當然,您對數據進行了錯誤的解釋。

對於符合C標准的啟動器,應聲明無參數的main函數,例如

int main( void )

例如,如果您有以下聲明

int a =2;
float c = 3;

然后通過以下方式調用函數printf

printf( "%d", a / c );

然后幕后發生了以下事件。

由於通常的算術轉換 ,表達式a / c具有float類型。

當函數printf用省略號表示時,然后對float類型的a / c表達式應用默認的參數提升 ,將表達式轉換為double類型。

作為該調用的結果,嘗試使用為int類型設計的轉換說明符%d輸出double類型的表達式。 Hanse呼叫具有未定義的行為。

根據C標准(7.21.6.1 fprintf函數)

9如果轉換規范無效,則行為未定義。275) 如果任何參數不是對應轉換規范的正確類型,則行為未定義。

暫無
暫無

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

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