int counter=-1;
NSArray *pointArray=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"1",@"2", nil];
NSString *result=[NSString stringWithFormat:@"%d",counter<pointArray.count-1];
信じられないかもしれませんが、結果は0です!!! 試してみて、誰が理由を教えてくれますか?
int counter=-1;
NSArray *pointArray=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"1",@"2", nil];
NSString *result=[NSString stringWithFormat:@"%d",counter<pointArray.count-1];
信じられないかもしれませんが、結果は0です!!! 試してみて、誰が理由を教えてくれますか?
符号付き数値(-1)と符号なし数値(pointArray.count-1)を比較しています。
次のコードがこの問題を再現していることに注意してください。
#include <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
NSUInteger uns = 4;
int sig = -1;
BOOL cmp = (sig < uns);
NSLog(@"(%d<%zu)=%d", sig, uns, cmp);
}
これの出力は
(-1<4)=0
指摘されているように、問題は、をと比較していることint
ですNSUInteger
。ただし、64ビットシステムでNSUInteger
は、はのtypedef
でunsigned long
あることに注意してください。
私たちが見ている動作は、通常の算術変換の結果です:
- いずれかのオペランドがlongdouble型の場合、もう一方のオペランドはlongdouble型に変換されます。
- 上記の条件が満たされず、一方のオペランドがdouble型の場合、もう一方のオペランドはdouble型に変換されます。
- 上記の2つの条件が満たされておらず、一方のオペランドがfloat型の場合、もう一方のオペランドはfloat型に変換されます。
- 上記の3つの条件が満たされない場合(どのオペランドも浮動型ではない場合)、次のようにオペランドに対して積分変換が実行されます。
- いずれかのオペランドがunsignedlong型の場合、もう一方のオペランドはunsignedlong型に変換されます。
- 上記の条件が満たされず、一方のオペランドがlong型で、もう一方がunsigned int型の場合、両方のオペランドがunsignedlong型に変換されます。
- 上記の2つの条件が満たされておらず、一方のオペランドがlong型である場合、もう一方のオペランドはlong型に変換されます。
- 上記の3つの条件が満たされておらず、いずれかのオペランドがunsigned int型である場合、もう一方のオペランドはunsignedint型に変換されます。
- 上記の条件のいずれも満たされない場合、両方のオペランドがint型に変換されます。
どちらのオペランドも浮動小数点型ではないため、に到達し4.
ます。2番目のオペランド(pointArray.count-1
)はタイプNSUInteger
、つまりタイプunsigned long
であるため、もう一方のオペランド(counter
)はタイプに変換さunsigned long
れ、その値18446744073709551615
は実際には。より大きくなり4
ます。