C为什么这个for循环在满足条件时不执行?

时间:2013-11-26 23:47:44

标签: c for-loop

我有一个for循环,用于找到最危险的特定船舶的直升机。

我遇到的问题是我需要忽略搜索中的LifeBoats(它们的类型为L,它是结构中的单个字符)并且只关注直升机,由{{1}表示这是结构中的单个字符。

我遇到的问题是当我有这个for循环时:

H

它肯定会被调用,我添加了一行:

closest_index = 0;

for (j = 0; j < asset_size; j++) {
        printf("type : %c \n", (assets + j)->type);
        if ((assets + j)->type == 'H') {
            if (((assets + j) ->distance_from_mayday) < ((assets + closest_index) ->distance_from_mayday)) {
                closest_index = j;
                printf("closest_index heli = %d \n", closest_index);

            }
        }
    }

在比较之前,它在控制台中产生了这个结果:

 printf("type : %c \n", (assets + j)->type);

正如你所看到的那样,type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : L type : H type : H type : H type : H type : H type : H 有值,所以我不明白为什么这个for循环没有按意图执行,有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我猜,列表中的第一个元素是'L'类型,并且低于或等于任何'H'值。因此,closest_index标记不会被移动。

最好记录距离本身或使用不可能的起始值(-1?)closest_index

编辑:

建议代码:

struct asset *result = NULL;

for (j = 0; j < asset_size; j++) {
     if (assets[j].type != 'H')
         continue;
     if (!result || assets[j].distance < result->distance)
         result = &assets[j];
}

答案 1 :(得分:1)

你的代码首先假设阵列中的第一个索引,在这种情况下是救生艇,是距离事件最近的直升机。

也许尝试这样的事情:

closest_index = 0;
closest_distance = INT_MAX;

for (j = 0; j < asset_size; j++) {
        printf("type : %c \n", assets[j]->type);
        if (assets[j]->type == 'H') {
            if (assets[j]->distance_from_mayday < closest_distance)  {
                closest_index = j;
                closest_distance = assets[j]->distance_from_mayday;
                printf("closest_index heli = %d \n", closest_index);
            }
        }
    }

如果您的列表总是在最后用helis排序(并且您将始终至少有一个heli),那么您可以通过将初始条件更改为:

来修复
closest_index = asset_size -1;

答案 2 :(得分:1)

问题不在于for;这是if:没有一架直升机比第一艘救生艇更近。这是解决这个问题的一种方法:

closest_index = -1;

for (j = 0; j < asset_size; j++) {
  printf("type : %c\n", (assets + j)->type);
  if ((assets + j)->type == 'H') {
    if ((closest_index < 0) ||
        (assets + j)->distance_from_mayday <
            (assets + closest_index)->distance_from_mayday) {
      closest_index = j;
      printf("closest_index heli = %d\n", closest_index);
    }
  }
}

作为奖励,如果没有直升机,循环将以closest_index == -1退出。

如果你关心最近的资产而不关心索引,你也可以简化循环:

Asset *closest_asset = NULL;

for (j = 0; j < asset_size; j++) {
  Asset *this_asset = assets + j;
  printf("type : %c\n", this_asset->type);
  if (this_asset->type == 'H' &&
      (closest_asset == NULL ||
       this_asset->distance_from_mayday < closest_asset->distance_from_mayday) {
    closest_asset = this_asset;
    printf("closest_index heli = %d\n", j);
  }
}