繁体   English   中英

Objective-C中FOR循环的奇怪行为

[英]Strange behavior of a FOR loop in objective-C

找到了我找不到解释的情况。

我在Objective-C中有一个数组数组。 这种情况下,数组有4个空数组。

NSArray *dados = [[NSArray alloc] initWithObjects:
             [[NSArray alloc] init],
             [[NSArray alloc] init],
             [[NSArray alloc] init],
             [[NSArray alloc] init],
             nil];

我希望“ for”通过内部数组(如果有两个或多个数字)。

for(int i=0; i<((NSArray *)[dados objectAtIndex:1]).count-1;i++){
        NSLog(@"do anything");
    }

这个“ for”进入无限循环。
但是,如果我使用“ NSLog”告诉我条件为-1,则“ is”不应该发生

NSLog(@"%d",((NSArray *)[dados objectAtIndex:1]).count-1);

2014-02-20 15:37:42.563 iKL Time-sheet[31666:a0b] -1

当停止条件为0 <-1时,该“ for”怎么可能成为无限循环?

被认为是一个很好的例子,如果有人可以解释什么将能够更好地理解我所感谢的语言

--------------------- // ----------------
回答:

for(int i=0; i<(int)(((NSArray *)[dados objectAtIndex:1]).count-1);i++){
            NSLog(@"do anything");
        }

与此演员一起运作良好,对此的解释在于下面的答案

count是一个无符号整数( NSUInteger )。 当计数为零时,减去一圈就产生一个大数。 零小于大数。

您的代码不明显,我会通过快速迭代进行重写

NSArray *dados = [[NSArray alloc] initWithObjects:
         [[NSArray alloc] init],
         [[NSArray alloc] init],
         [[NSArray alloc] init],
         [[NSArray alloc] init],
         nil];

for(NSArray * a in dados)
{
    if([a count] >1)
    {
        NSLog(@"do something");
    }
}

编辑:

要么

@synchronized(dados){

    for(int i=0; i<[dados count]);i++){
       if([[dados objectAtIndex:i]count]>1)
       NSLog(@"do anything");
    }
}

因为您的for循环不会进行到最后...您正在组合两个在逻辑上无法组合的测试...除非您的数组首先按元素数量排序。

从count中删除-1,否则,即使数组中包含许多对象,它也始终会跳过最后一个元素

for(int i=0; i<((NSArray *)[dados objectAtIndex:1]).count-1;i++){
        NSLog(@"do anything");
}
NSArray *dados = @[@[],@[],@[]];

// I want a "for" to go through an internal array
// if it has two or more numbers (skipping the last one)
for( NSUInteger idx = 0;
     (dados[1].count >= 2) && (idx < dados[1].count - 1);
     idx++) 
{
    NSLog(@"do anything");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM