Objective c 为什么str为nil时([str length]-2)大于0?

Objective c 为什么str为nil时([str length]-2)大于0?,objective-c,for-loop,Objective C,For Loop,当运行以下代码时,它进入for循环并运行NSLog。为什么会发生这种情况 NSString *aString = nil; for (int i=0; i<([aString length]-2); i++) { NSLog(@"Inside loop."); } 正如我所说,[aString length]-2的结果是-2,这小于0?如果i你要求for循环运行,如果i更精确一点,[NSString length]返回一个无符号整数,所以从零减去二记住,调用nil上的任何方法都不

当运行以下代码时,它进入for循环并运行NSLog。为什么会发生这种情况

NSString *aString = nil;

for (int i=0; i<([aString length]-2); i++) {
   NSLog(@"Inside loop.");
}

正如我所说,[aString length]-2的结果是-2,这小于0?

如果i你要求for循环运行,如果i更精确一点,[NSString length]返回一个无符号整数,所以从零减去二记住,调用nil上的任何方法都不会得到-2,它会给你一个非常大的值,非常多。将其强制转换为int或NSInteger以获得所需的结果。

更准确地说,[NSString length]返回一个无符号整数,因此从零减去二记住,对nil调用任何方法都不会得到-2,而是得到一个非常非常大的数。将其强制转换为int或NSInteger以获得所需的结果。

如果[aString length]-2为-2,而不是-2,则0<-2为false,循环将不会运行。根据海报,它确实在运行。Objective-C中的消息nil安全地返回零,并且总是有,除非返回类型是struct,在这种情况下,您可能会遇到问题。甚至在更现代的编译器中,这一点也是固定的;forint i=0;由于0u-1=max int.@Olof,因此结果将是max int-1,因为将其分配给中类型的变量会将其从无符号int隐式转换为有符号int。如果[aString length]-2为-2,则0<-2为false,循环将不会运行。根据海报,它确实在运行。Objective-C中的消息nil安全地返回零,并且总是有,除非返回类型是struct,在这种情况下,您可能会遇到问题。甚至在更现代的编译器中,这一点也是固定的;forint i=0;由于0u-1=max int.@Olof,因此结果将是max int-1,因为将它赋给中类型的变量会隐式地将它从无符号int转换为有符号int。