iOS SDK 6.1 をターゲットとするユニバーサル iOS アプリがあり、コンパイラはApple LLVM コンパイラ 4.2に設定されています。コードにブレークポイントを配置して次を実行すると、 に対して奇妙な結果が得られsin(int)
ます。
参考までに、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)
ます。- , または(たとえば expr (double)sin(70))に置き換える
p
と、まったく同じ結果が得られます。po
expr
デバッガがこのように動作するのはなぜですか?
これは、関数を呼び出すたびにすべてのパラメーターを型キャストする必要があるということですか?
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)