Re: [問題] printf() 整數, 浮點數放的順序影響輸出

看板C_and_CPP作者 (f0VMRgEBA)時間10年前 (2013/07/17 19:53), 編輯推噓5(509)
留言14則, 9人參與, 最新討論串2/4 (看更多)
※ 引述《twayfind (橘水壎)》之銘言: : #include <stdio.h> : int main(void) : { : int a=10; : int b=20; : : float d=0; : : d=(float)a/b; : : printf("%d,%.3f\n",d,d); : printf("%.3f,%d\n",d,d); : return 0; : } : → kiedveian:先轉型成整數 07/17 15:07 : 推 lc85301:我比較好奇為什麼前一個參數的轉換影響到下一個整數? 07/17 17:01 printf (及 scanf) 是使用 C 語言的可變參數下去實作 這種可變參數有幾個限制 首先函式不會知道你傳了什麼東西進去 得要有另外的方法來指名才行 printf/scanf 的做法是傳入一個格式字串以表示後面有哪些參數 再來 不到 int 等級的整數會升級成 int 再傳 float 則會升級成 double 因此這裡推入了兩個 float 實際上傳進 printf 裡時是兩個 double (所以其實 printf 裡指定 %f 跟 %lf 是一樣的) 而 %d 這個格式會去抓一個 int 出來 但是在 32-bit 的架構下 int 跟 double 是不一樣大的 (int 佔 4 byte double 佔 8 byte) 所以在 %d,%.3f 的狀況下 printf 會這樣去抓值: ┌ 第一個 d ┐ ┌ 第二個 d ┐ ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** └ %d ┘ └ %.3f ┘ 自然就會跟 %.3f,%d 時抓到的不一樣了: ┌ 第一個 d ┐ ┌ 第二個 d ┐ ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** └ %.3f ┘ └ %d ┘ 無論如何 %d 抓到的一定是錯誤的值 所以一定會有怪結果 在那之後的結果也就不一定正確了 -- 題外話: %f 跟 %lf 在 scanf 裡則有差 因為這時傳進 scanf 的參數全是指標 而 float * 跟 double * 這是兩種指標 所以必須要分開這兩者才行 -- LPH [acronym] = Let Program Heal us -- New Uncyclopedian Dictionary, Minmei Publishing Co. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.141.187 ※ 編輯: LPH66 來自: 122.118.141.187 (07/17 19:55)

07/17 19:59, , 1F
你啥時回到人間啊是說
07/17 19:59, 1F

07/17 19:59, , 2F
再半年?
07/17 19:59, 2F

07/17 19:59, , 3F
噢 忘了先跟lph擊掌 (拍擊lph (?))
07/17 19:59, 3F

07/17 20:29, , 4F
/膜拜
07/17 20:29, 4F

07/17 20:53, , 5F
感謝大大的解說
07/17 20:53, 5F

07/17 22:23, , 6F
從錯誤的使用方法和結果中也可以學習~
07/17 22:23, 6F

07/17 22:27, , 7F
我一直以為varg是array of void*,原來是直接疊起來
07/17 22:27, 7F

07/17 22:35, , 8F
我也以為是這樣
07/17 22:35, 8F

07/17 22:38, , 9F
所以用stdcall做printf然後參數給的比%數少的話該不會會
07/17 22:38, 9F

07/17 22:38, , 10F
爆炸...
07/17 22:38, 10F

07/17 23:13, , 11F
stdcall 是 callee 清堆疊所以不能用可變參數...
07/17 23:13, 11F

07/17 23:24, , 12F
可是c standard應該是沒有規定這個吧 @@
07/17 23:24, 12F

07/18 04:00, , 13F
<(_ _)>
07/18 04:00, 13F

07/18 05:30, , 14F
worship
07/18 05:30, 14F
文章代碼(AID): #1HveMkKw (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1HveMkKw (C_and_CPP)