我有一個通用iOS應用程序,其目標iOS SDK 6.1,編譯器設置爲Apple LLVM編譯器4.2。當我在我的代碼中放置一個斷點並運行以下時,我得到奇怪的結果sin(int)
。Sin(int)在Xcode調試器(lldb)中損壞
僅供參考,sin(70)
= 0.7739
(70以弧度表示)。
(lldb) p (double)sin(70)
(double) $0 = -0.912706376367676 // initial value
(lldb) p (double)sin(1.0)
(double) $1 = 0.841470984807897 // reset the value sin(int) will return
(lldb) p (double)sin(70)
(double) $2 = 0.841470984807905 // returned same as sin(1.0)
(lldb) p (double)sin(70.0)
(double) $3 = 0.773890681557889 // reset the value sin(int) will return
(lldb) p (double)sin(70)
(double) $4 = 0.773890681558519
(lldb) p (double)sin((float)60)
(double) $5 = -0.304810621102217 // casting works the same as appending a ".0"
(lldb) p (double)sin(70)
(double) $6 = -0.30481062110269
(lldb) p (double)sin(1)
(double) $7 = -0.304810621102223 // every sin(int) behaves the same way
觀察:
- 爲
sin(int)
在調試會話中的第一個值始終-0.912706376367676
。 sin(int)
將始終返回從上次執行的sin(float)
返回的相同值。- 如果我將
p
替換爲po
或expr
(例如expr(double)sin(70)),我會得到相同的確切結果。
爲什麼調試器的行爲如此?
這是否意味着我每次調用函數時都應該鍵入每個參數的類型?
一些更有趣的行爲與NSLog的:
(lldb) expr (void)NSLog(@"%f", (float)sin(70))
0.000000 // new initial value
(lldb) expr (void)NSLog(@"%f", (float)sin(70.0))
0.773891
(lldb) expr (void)NSLog(@"%f", (float)sin(70))
0.000000 // does not return the previous sin(float) value
(lldb) p (double)sin(70)
(double) $0 = 1.48539705402154e-312 // sin(int) affected by sin(float) differently
(lldb) p (double)sin(70.0)
(double) $1 = 0.773890681557889
(lldb) expr (void)NSLog(@"%f", (float)sin(70))
0.000000 // not affected by sin(float)
PO命令打印對象 - 嘗試 'P' 來代替。另外,sin接受弧度參數,所以sin(90)不應該爲零 – Vladimir
@Vladimir:它也發生在p上,我更新了代碼以反映這一點。我知道罪以弧度爲單位,這就是爲什麼第一個輸出是奇怪的。 – Senseful
請給我一個蘋果的錯誤! – matt