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

作者: bjiyxo (若自礌)   2014-10-10 00:45:20
開發平台(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完全不知道從哪裡出現問題
作者: akasan (KITO)   2014-10-10 01:09:00
作者: suhorng ( )   2014-10-10 01:09:00
jj 跟 k 又不是 unsigned long, 怎麼會用 %lu編譯開個 -Wformat 讓 compiler 告訴你
作者: bjiyxo (若自礌)   2014-10-10 01:22:00
unsigned long跟unsigned int不是都是4B嗎?不能混用嗎QQ不過即使使用%u也還是沒有改變結果?
作者: lantw44 (#######################)   2014-10-10 01:42:00
scanf 的 i 和 j 也要改成 %u我這裡執行如果 scanf 沒改程式直接 crashunsigned long 和 unsigned int 不保證一樣大也不保證是幾個 bytes
作者: scwg ( )   2014-10-10 01:52:00
樓上幾位都指出是 format string 錯了, 其中造成前面的 k 固定是 0 的原因是第一個 %lu: jj[k-1] 是 long long 所以不能用 %lu, 要用 "%llu". 32bit compiler 會把 jj[k-1]的8bytes放進stack, %lu 拿前 4 bytes, 第二個 %lu 拿後 4 bytes,因此該印出 k 的第二個 %lu 印出的是 jj[k-1] 的後 4 bytes
作者: bjiyxo (若自礌)   2014-10-10 01:55:00
原來如此! 學到了! 非常感謝scwg大!
作者: purincess (purincess)   2014-10-10 13:25:00
請google LLP64, LP64, 會有更詳細的說明 XD
作者: uranusjr (←這人是超級笨蛋)   2014-10-10 14:42:00
LPH66 表示:
作者: LPH66 (-6.2598534e+18f)   2014-10-10 16:27:00
(探頭
作者: EdisonX (卡卡獸)   2014-10-10 20:44:00
我笑了
作者: purincess (purincess)   2014-10-11 00:34:00
嗨LPH (揮手
作者: carylorrk (carylorrk)   2014-10-11 13:55:00
嗨 LPH66,今天下午打球,球你帶(誤
作者: BlazarArc (Midnight Sun)   2014-10-14 16:50:00
XDDD
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2014-10-14 18:18:00
XDDDD

Links booklink

Contact Us: admin [ a t ] ucptt.com