2
int counter=-1;
NSArray *pointArray=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"1",@"2", nil];
NSString *result=[NSString stringWithFormat:@"%d",counter<pointArray.count-1];

信じられないかもしれませんが、結果は0です!!! 試してみて、誰が理由を教えてくれますか?

4

2 に答える 2

3

符号付き数値(-1)と符号なし数値(pointArray.count-1)を比較しています。

于 2013-01-17T03:44:50.397 に答える
0

次のコードがこの問題を再現していることに注意してください。

#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は、はのtypedefunsigned longあることに注意してください。

私たちが見ている動作は、通常の算術変換の結果です:

  1. いずれかのオペランドがlongdouble型の場合、もう一方のオペランドはlongdouble型に変換されます。
  2. 上記の条件が満たされず、一方のオペランドがdouble型の場合、もう一方のオペランドはdouble型に変換されます。
  3. 上記の2つの条件が満たされておらず、一方のオペランドがfloat型の場合、もう一方のオペランドはfloat型に変換されます。
  4. 上記の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ます。

于 2013-01-17T04:01:20.590 に答える