1

nil ポインターにメッセージを送信すると、通常は 0 が返されると常に考えていました。したがって、同じことがプロパティにも当てはまります。しかし、このコードスニペットは私の仮定と矛盾しているようです

NSArray *testArray;
NSInteger i = 0;
NSLog(@"testArray.count-1=%ld", testArray.count-1);
NSLog(@"i<testArray.count-1=%d", i<testArray.count-1);

出力は

2013-05-22 11:10:24.009 LoopTest[45413:303] testArray.count-1=-1
2013-05-22 11:10:24.009 LoopTest[45413:303] i<testArray.count-1=1

最初の行は意味がありますが、2 番目の行は意味がありません。私は何が欠けていますか?

編集: @JoachimIsaksson と @Monolo に感謝します。問題は実際には署名されていないかどうかであり、次のコードはそれを示しています。

NSArray *testArray;
NSInteger i = 0;
unsigned ucount = 0;
int count = 0;

NSLog(@"testArray.count-1=%ld", testArray.count-1);
NSLog(@"i<testArray.count-1=%d", i<testArray.count-1);
NSLog(@"i<ucount-1=%d", i<ucount-1);
NSLog(@"i<count-1=%d", i<count-1);

そして、出力は

2013-05-22 11:26:14.443 LoopTest[45496:303] testArray.count-1=-1
2013-05-22 11:26:14.444 LoopTest[45496:303] i<testArray.count-1=1
2013-05-22 11:26:14.444 LoopTest[45496:303] i<ucount-1=1
2013-05-22 11:26:14.445 LoopTest[45496:303] i<count-1=0
4

2 に答える 2

5

nil レシーバーからの戻り値

プロパティにアクセスするか、nil オブジェクトから戻り値を読み取ると、デフォルト値が取得されます。これは通常、数値の戻り値の型では 0 です。そのため、配列が nilled のときに配列のカウントを取得すると、0 が生成されます。nil レシーバーからのその他の可能な値は、BOOL の場合は NO、オブジェクトの戻り値の型の場合は nil です。返された構造体は、すべてのメンバーがゼロに初期化されています。

配列カウントは符号なしです...

ここで、配列カウントが NSUInteger を返すことを覚えておく必要があります。これは符号なしで0から引くとアンダーフローして非常に大きな数値になります。

NSLog-1が最初のステートメントを出力するのはなぜですか?

@"%ld"これは、長い符号付き整数を指定するを使用したためです。そのため、値は符号付きとして解釈され、結果は -1 になります。変数の型は実際には unsigned long であり、その書式指定子は@"lu". これを使用すると、18446744073709551615 になります (プラットフォームによって異なる場合があります)。

これは 2 番目の NSLog ステートメントにどのように影響しますか?

最初のステートメントで何が起こっているかを考慮すると、2 番目のステートメントのほうがより理にかなっている可能性があります。を比較していると思ったかもしれませんが0 < -1、これは結果が NO であり、結果が 1 になるはずはありません。実際に比較されているのは0 < 18446744073709551615であり、結果は YES になります。これが、結果が 1 になる理由です。

要するに、NSLog で誤った形式の識別子を使用しているため、値の解釈方法に混乱が生じていました。

于 2013-05-22T15:34:55.727 に答える
3

それは常に何もないバージョンです: nil、ゼロ、NO.

の戻り値の型はcountNSUIntegerコメントで Joachim Isaksson によっても指摘されています。testArray.count-1は -1 であると予想され、バイナリでエンコードされます...111111(正確なビット数は、プラットフォーム、およびコードが 32 ビットまたは 64 ビットとしてコンパイルされるかによって異なります)。ただし、式は符号なしであるため、代わりに非常に大きな数として解釈されます。実際には、符号なし整数として表現できる最大の数です。

この非常に大きな数は、変数と比較する iとはるかに大きいです。したがって、出力。

于 2013-05-22T15:14:55.727 に答える