最近、Objective-cで符号付きの値と符号なしの値を比較する際に問題が発生しました。この問題の例を次に示します。
NSArray *array = [NSArray array];
NSLog(@"Count = %d", array.count);
NSLog(@"Count - 2 = %d", array.count - 2);
if (array.count - 2 > 0) {
NSLog(@"A");
} else {
NSLog(@"B");
}
一見すると、次のコードが出力されるはずB
です。ただし、実行すると、次のように表示されます。
Count = 0
Count - 2 = -2
A
これで、問題は符号付きの値と符号なしの値の比較にあることがわかりました(array.count
is unsigned long
)。
ただし、この種のエラーを見つけるのは非常に困難です(コードはコンパイルされ、警告はなく、array.count
署名されていないことや重要であることに気付かない場合があります)。問題は、どうすればそのような状況を回避できるかということです。符号付きの値と符号なしの値を比較する安全な方法はありますか?
NSLog(@"%d", array.count - 2)
なぜ印刷するのかも興味深い-2
ですか?