1

Xcode/Objective C からのこれらの結果を説明できる人はいますか? 確かに、-2 が 31 より大きい値をテストするケースはありません。

(lldb) p dayOfMonth
(int) $37 = -2
(lldb) p (dayOfMonth > 31)
(bool) $38 = true
(lldb) p (dayOfMonth > (int)31)
(bool) $39 = true 
(lldb) p (dayOfMonth > (float)31) 
(bool) $40 = false

私はそのような真っ直ぐな間違った答えを見たことがなく、それがどのように誤解される可能性があるのか​​ 想像できません. デバッガーが言うように、dayOfMonth は単なる int です。

追加する編集:失敗するコードは次のとおりです(無関係な行がいくつかカットされています):

    NSRange monthdays = [self.calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:self.displayedDate];
    int dayOfMonth = i+1-shift;  // negative days are at end of prev month; days higher than length of month are in next
    if (dayOfMonth < 1) cellView.dayLabel = prevMonthDays.length + dayOfMonth;
    if (dayOfMonth > monthdays.length) cellView.dayLabel = dayOfMonth - monthdays.length;

ifdayOfMonth が負の場合、2 番目は true と評価されます。

4

1 に答える 1

2

確認済み - lldb IR インタープリターのバグです。

これを修正するパッチへのリンクは次のとおりです

新しいテストケースはまさにあなたの問題であることに注意してください:

+        self.expect("expression (int)-2",
+            startstr = "(int) $4 = -2")
+
+        self.expect("expression $4 > (int)31",
+            startstr = "(bool) $5 = false")

そのため、将来的には物事がうまく機能し続けるはずです!

コードに関する限り、バグがあります。この条件:

if (dayOfMonth > monthdays.length)

あなたがしたいことをしていません。 dayOfMonth署名あり、monthdays.length署名なしです。つまりdayOfMonth、署名されていない型に昇格し、比較がうまくいきません。クリーンアップするには、そこにキャストが必要です。

if (dayOfMonth > (NSInteger)monthdays.length)
于 2013-05-24T20:39:46.673 に答える