Objective c 在递减for循环中使用整数时,如何确定>;=0

Objective c 在递减for循环中使用整数时,如何确定>;=0,objective-c,Objective C,如果我想使用像这样的循环 for (NSUInteger row = 10; row >= 0; row--) { // do something } 因为行是一个无符号整数,所以它总是>0,我该如何回避这个事实呢。for循环的中间结构是否变成: for (NSUInteger row = 10; row; row--) { } 你需要一张未签名的支票吗?如果是这样的话,你就必须想出一个符合你要求的测试。可能行>=0&&row是否需要未签名的?如果是这样的话,你就必须想出一个符合

如果我想使用像这样的循环

for (NSUInteger row = 10; row >= 0; row--) {
  // do something
}
因为行是一个无符号整数,所以它总是>0,我该如何回避这个事实呢。for循环的中间结构是否变成:

for (NSUInteger row = 10; row; row--) {

}

你需要一张未签名的支票吗?如果是这样的话,你就必须想出一个符合你要求的测试。可能行>=0&&row是否需要未签名的?如果是这样的话,你就必须想出一个符合你要求的测试。可能行>=0&&row您应该执行以下操作之一:

for (NSUInteger row = 10; row >= 1; row--) {
}
或者这个:

for (NSInteger row = 10; row >= 0; row--) {
}

您应该执行以下操作之一:

for (NSUInteger row = 10; row >= 1; row--) {
}
或者这个:

for (NSInteger row = 10; row >= 0; row--) {
}

如果使用NSInteger而不是NSUInteger,这会变得简单一些。由于NSInteger是有符号整数类型,因此对值为零的变量调用减量运算符(
--
)会将值更改为-1,因此可以使用简单的比较来测试:

for (NSInteger row = 10; row >= 0; row--) {
    // do stuff with row
}
如果出于某种原因必须使用NSUInteger,则对值为零的变量调用减量运算符将导致变量的值环绕到NSUInteger的最大可能值。您可以使用
NSUIntegerMax
对此进行测试

for (NSUInteger row = 10; row != NSUIntegerMax; row--) {
    // do stuff with row
}

如果使用NSInteger而不是NSUInteger,这会变得简单一些。由于NSInteger是有符号整数类型,因此对值为零的变量调用减量运算符(
--
)会将值更改为-1,因此可以使用简单的比较来测试:

for (NSInteger row = 10; row >= 0; row--) {
    // do stuff with row
}
如果出于某种原因必须使用NSUInteger,则对值为零的变量调用减量运算符将导致变量的值环绕到NSUInteger的最大可能值。您可以使用
NSUIntegerMax
对此进行测试

for (NSUInteger row = 10; row != NSUIntegerMax; row--) {
    // do stuff with row
}

如果你真的需要使用一个整数

for (NSUInteger row = 10; row >= 0; row--) {
     // do something
    if(row == 0) {break;}
}

否则,如果您确实需要使用NSInteger,请按照Simon Whitaker的建议尝试使用NSInteger

for (NSUInteger row = 10; row >= 0; row--) {
     // do something
    if(row == 0) {break;}
}

否则,尝试使用Simon Whitaker建议的NSInteger

另一个技巧是将减量移动到条件检查部分。顺便说一句,这个循环的操作比经典的少

for (NSUInteger i = 10; i-- > 0;)
{
}

另一个技巧是将减量移动到条件检查部分。顺便说一句,这个循环的操作比经典的少

for (NSUInteger i = 10; i-- > 0;)
{
}

“我会留下它,因为它至少传达了意图。”它还会产生一个编译器警告,所以应该删除。(如果您的代码中充斥着生成“可忽略”编译器警告的结构,那么当它们出现时,您就不太可能发现新的、可能更重要的警告。)好吧,如果我们真的在讨论我将要做的事情,我不会从这个结构开始。如果我被限制在这里使用unsigned,我仍然会显式地指定范围,而不是依赖非idomatic构造,比如comparing to
nsuigermax
。我不同意所有导致警告的代码都需要更改——如果是这样的话,它们也可能是错误。“我会保留它,因为它至少传达了意图。”它还会产生编译器警告,因此应该删除。(如果您的代码中充斥着生成“可忽略”编译器警告的结构,那么当它们出现时,您就不太可能发现新的、可能更重要的警告。)好吧,如果我们真的在讨论我将要做的事情,我不会从这个结构开始。如果我被限制在这里使用unsigned,我仍然会显式地指定范围,而不是依赖非idomatic构造,比如comparing to
nsuigermax
。我不同意导致警告的所有代码都需要更改——如果是这种情况,它们也可能是错误。根据定义,这些索引不应该是负的,因此使用NSInteger传递语义意图。根据定义,这些索引不应该是负的,所以使用NSInteger传递语义意图。