簡體   English   中英

使用 C 中的格式說明符打印

[英]Printing with format specifiers in C

在 class 測驗中,我被要求編寫以下代碼片段的 output。

x = 1.234;
printf("x=%2d");

變量x包含點值,所以我假設它是浮點/雙精度類型。

在論文中,我回答說這段代碼只是簡單地在引號內打印語句(如x=%2d ),如 print function 它會按原樣打印“”中的任何內容。

但后來我在我的編譯器中運行代碼以找到 output 為x=4199232 (雖然不同編譯器中的數字有所不同)(編輯-我在這里添加了編譯代碼)

#include <stdio.h>

int main() {
    float x = 1.234;
    printf("x=%2d");
    return 0;
}

任何人都可以解釋一下這里到底發生了什么。

該代碼具有未定義的行為(這解釋了為什么不同編譯器中的數字不同),因為您沒有為轉換提供int類型的參數%2d

如果你寫了這個:

x = 1.234;
printf("x=%2d", x);

output 將取決於代碼片段中未出現的x類型。 如果x使用int類型或更小的 integer 類型定義,包括_Bool ,則 output 應該是x= 1 ,但如果x具有任何其他算術類型,包括floatdouble ,則行為再次未定義,因為參數沒有%d的預期類型。

另請注意,格式字符串中沒有尾隨\n ,因此 output 可能會延遲到程序結束,並且可能根本不會出現在某些不符合要求的系統上。

在您的示例代碼中,由於缺少printf的參數,因此行為未定義,但您確實將x定義為float ,當傳遞給printf時,它將被隱式轉換為double ,對於%d無效。

這是修改后的版本:

#include <stdio.h>

int main() {
    double x = 1.234;            // only use `float` when necessary
    printf("x=%2d\n", (int)x);   // outputs `x= 1`
    printf("x=%2f\n", x);        // outputs `x=1.234000`
    printf("x=%2g\n", x);        // outputs `x=1.234`
    printf("x=%.2f\n", x);       // outputs `x=1.23`
    return 0;
}

在這份聲明中

printf("x=%2d");

您忘記為轉換說明符d指定參數。 所以程序將嘗試 output 存儲在 memory 中的第二個參數應該是什么。

所以程序有未定義的行為。

如果您指定第二個參數,它也會有未定義的行為

printf("x=%2d", x );

因為使用了無效的轉換說明符和浮點類型的 object。

到 output 只是你應該寫的格式字符串

printf("x=%%2d");

暫無
暫無

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

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