[問題] printf同個變數在同一行竟然出現不同值

看板C_and_CPP作者 (若自礌)時間9年前 (2014/10/10 00:45), 編輯推噓4(4019)
留言23則, 12人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) dev c++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): printf("%lu,%lu,%lu\n",jj[k-1],k,k); 前面的k跟後面的k竟然值不同 而且前面的k固定值是0 神秘的是,使用64bit的compiler就會成為相同的值了 餵入的資料(Input): 1 3 預期的正確結果(Expected Output): 至少k要一致吧 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) http://ideone.com/kKFOvS 補充說明(Supplement): QQ完全不知道從哪裡出現問題 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.65.19 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1412873125.A.E4D.html

10/10 01:09, , 2F
jj 跟 k 又不是 unsigned long, 怎麼會用 %lu
10/10 01:09, 2F

10/10 01:10, , 3F
編譯開個 -Wformat 讓 compiler 告訴你
10/10 01:10, 3F

10/10 01:22, , 4F
unsigned long跟unsigned int不是都是4B嗎?不能混用嗎QQ
10/10 01:22, 4F

10/10 01:27, , 5F
不過即使使用%u也還是沒有改變結果?
10/10 01:27, 5F

10/10 01:42, , 6F
scanf 的 i 和 j 也要改成 %u
10/10 01:42, 6F

10/10 01:43, , 7F
我這裡執行如果 scanf 沒改程式直接 crash
10/10 01:43, 7F

10/10 01:44, , 8F
unsigned long 和 unsigned int 不保證一樣大
10/10 01:44, 8F

10/10 01:44, , 9F
也不保證是幾個 bytes
10/10 01:44, 9F

10/10 01:52, , 10F
樓上幾位都指出是 format string 錯了, 其中造成前面的 k 固
10/10 01:52, 10F

10/10 01:52, , 11F
定是 0 的原因是第一個 %lu: jj[k-1] 是 long long 所以不能
10/10 01:52, 11F

10/10 01:53, , 12F
用 %lu, 要用 "%llu". 32bit compiler 會把 jj[k-1]的8bytes
10/10 01:53, 12F

10/10 01:54, , 13F
放進stack, %lu 拿前 4 bytes, 第二個 %lu 拿後 4 bytes,
10/10 01:54, 13F

10/10 01:54, , 14F
因此該印出 k 的第二個 %lu 印出的是 jj[k-1] 的後 4 bytes
10/10 01:54, 14F

10/10 01:55, , 15F
原來如此! 學到了! 非常感謝scwg大!
10/10 01:55, 15F

10/10 13:25, , 16F
請google LLP64, LP64, 會有更詳細的說明 XD
10/10 13:25, 16F

10/10 14:42, , 17F
LPH66 表示:
10/10 14:42, 17F

10/10 16:27, , 18F
(探頭
10/10 16:27, 18F

10/10 20:44, , 19F
我笑了
10/10 20:44, 19F

10/11 00:34, , 20F
嗨LPH (揮手
10/11 00:34, 20F

10/11 13:55, , 21F
嗨 LPH66,今天下午打球,球你帶(誤
10/11 13:55, 21F

10/14 16:50, , 22F
XDDD
10/14 16:50, 22F

10/14 18:18, , 23F
XDDDD
10/14 18:18, 23F
文章代碼(AID): #1KDhkbvD (C_and_CPP)