簡體   English   中英

printf函數的問題?

[英]problem with printf function?

我寫了以下程序

 #include <stdio.h>

 main()
 {
 int i = 2;
 float c = 4.5;
 printf("%d\n",c);
 printf("%f\n",i);
 return 0;
 }

雖然我知道這是錯誤的做法,當我運行程序時,我得到了答案

0
4.500000

但是當我用這種方式交換printf語句時

#include <stdio.h>

main()
{
int i = 2;
float c = 4.5;
printf("%f\n",i);
printf("%d\n",c);
return 0;
}

輸出是

0.000000
0

我無法理解發生了什么,任何人都會解釋我。

printf不會轉換它的參數。 它正在查看包含浮點數的內存並將其打印為好像是一個整數 - 就像拿一個MP3文件並要求單詞打開它一樣,就像它是一個文檔一樣。

浮點數以完全不同的方式存儲在內存中的整數 - 它不僅僅是一個帶有一些小數點的整數

使用不正確的格式描述符會導致未定義的行為
未定義的行為意味着無法解釋行為。 它可能無法工作或給出不可預測的結果,這種行為無論如何都會有所不同,它無法以便攜式結論的方式解釋所有編譯器。

一個整數和一個浮點數具有不同的內部表示,因此您不能將printf %f誤認為%d以避免不可預測的結果。 人們使用C尤其是因為C很快,而且速度很快只是因為它讓所有人都受到程序員的責任。 所以不要指望printf在引擎蓋下做一些神奇的轉換,因為它不會。

基本上,格式占位符是關於如何從可變長度參數列表中檢索和解釋下一塊內存的函數的指令。 它希望格式完全符合您的要求。 以非預期的方式檢索內存時,可能會導致各種問題和未定義的行為。 這就是printf及其同類產品可以利用的原因。

基本上,格式控件根據指定的數據類型替換占位符。

  • %d期望int類型的參數
  • %f需要double類型的參數

這樣做的好方法是

#include <stdio.h>

int main(){
   int i = 2;
   float c = 4.5;
   printf("%d\n",i);
   printf("%f\n",c);
   return 0;
}

暫無
暫無

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

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