首页 > 解决方案 > 内循环索引不等于外循环索引时的嵌套循环

问题描述

当内部循环的索引等于外部循环索引时,嵌套循环逻辑跳过内部循环。

在内部循环中使用了 if 语句,效果如下:

for (i=0;i<N;i++)
  for (j=0;j<N;j++)
    if (j!=i)
      ... some code

我相信这给了我预期的结果,但有没有一种我可能不知道的 CPU 消耗较少的方法?

标签: clogicnested-loops

解决方案


如果您可以假设N <= i,您可以将内部循环拆分为 2 个单独for的循环以减少测试次数:

for (i = 0; i < N; i++) {
    for (j = 0; j < i; j++) {
        ... some code
    }
    /* here we have j == i, skip this one */
    j++;
    for (; j < N; j++) {
        ... same code
    }
}

这会导致更多的代码,但对j. 但是请注意,如果N是一个常量,编译器可能会更有效地展开原始内部循环。仔细的基准测试是确定该解决方案是否值得为您的问题、编译器和架构付出努力的唯一方法。

为了完整起见,这段代码可以简化为:

for (i = 0; i < N; i++) {
    for (j = 0; j < i; j++) {
        ... some code
    }
    /* here we have j == i, skip this one */
    while (++j < N) {
        ... same code
    }
}

推荐阅读