[英]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
具有任何其他算術類型,包括float
和double
,則行為再次未定義,因為參數沒有%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.