[问题] 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