嵌套for循环:为什么()中的条件无效?

时间:2015-07-28 05:14:13

标签: c for-loop

因此,对于下面的代码,我希望C程序在1到999之间显示奇数(不是3的倍数),一行中有9个。

1   5   7   11   13   17   19   23   25

29   31   .. and so on.

以下是我使用的代码。虽然我确实弄明白了如何使其工作 - if (i >=999) break;行有帮助,但我不明白为什么i超过999如果该断裂线不存在。换句话说,两个循环中的条件i < 999都是无效的。

有人可以帮助我理解为什么会这样做吗?

我在课堂上使用Microsoft Visual Studio 2005。

#include <stdio.h>

void main(void)
{
    int i, j;

    for(i = 1; i < 999; i++)
    {
        for(j = 0; i < 999, j< 9; i++, j++)
        {
            if (i%2 == 0 || i%3 == 0) {
                j = j-1;
                if (i >=999) break;
                continue;
            }
            printf("%-3d ", i);
            if (j == 8) break;
        }
        printf("\n");
    }
}

5 个答案:

答案 0 :(得分:1)

因为原始代码有点复杂,我认为从头开始回答你的问题是最容易的。这是一个实现你想要的C代码,它比OP简单得多:

void main(void) {
    int counter = 0;

    for (int i=0; i < 1000; ++i) {
        if (i % 2 != 0 && i % 3 != 0) {  // if not even (i.e. odd) AND not divisible by 3
            if (counter == 9) {          // start a new line for each 9 numbers
                printf("\n");
                counter = 0;             // reset the counter
            }
            printf("%-3d ", i);
            ++counter;                   // increment counter for each new number
        }
    }
}

我认为您不需要或应该在解决方案中使用双for循环。您在for循环中的条件也显得非常复杂。该解决方案对0到999之间的所有数字进行一次传递,并生成所需的输出。

答案 1 :(得分:1)

一种简单的方法是

int numbers_in_line=0;
for(int i=1;i<=999;i++)
{
   if(i%2 && i%3) // not divisible by 2 as well as 3.
   {
      printf("%d ",i);
      numbers_in_line++;       // printed one number more
      if(numbers_in_line==9) 
      {
         printf("\n");
         numbers_in_line=0;  //reset for next line
      }
   }
}

在您的代码中,您可以轻松使用count变量来记住您打印的数量。就是这样。

if(i%2==0 || i%3==0)中的一件事现在,如果i = 6,它会打印出来但不应该打印出来。显然可以if(i%2!=0 && i%3!=0)

您的代码中的另一件事情很清楚,

  1. 知道`,`的工作原理。(正如其他答案所述)
  2. 使用简单的逻辑而不是否定它...(如果提到的话)
  3. 为什么你继续减少以及增加j。它的唯一目的是跟踪你排成一行的数字。因此,要么减少/增加它,然后根据您的要求分别重置为9/0。这样想你永远不会删除你在一行中打印的数字,为什么减少?

答案 2 :(得分:0)

问题出在for循环的条件下。有两个条件i < 999, j < 9.

但它仅检查最后一个条件。

您想将其更改为for(j = 0; i < 999 && j< 9; i++, j++)以检查两种情况

答案 3 :(得分:0)

仔细考虑表达。 i < 999 , j < 9。在这里,首先i < 999将被评估,之后j < 9。但是,整个表达式的结果将仅由j < 9的结果产生。请查看代码段,了解更多澄清:

#include <stdio.h>

int main()
{
    int flag = (0,0);
    printf("%i ",flag);

    flag = (0,1);
    printf("%i ",flag);

    flag = (1,0);
    printf("%i ",flag);

    flag = (1,1);
    printf("%i ",flag);
}

<强>输出: 0 1 0 1

正如您的代码中所提到的,如果 i 的值= 999,则 j 的值将显示为-1,后者变为{{ 1}}在下一次迭代中,类似地, i 的值增加1。因此,0的结果为i < 9990 or false的结果为j < 9

因为,原始表达式为1 or true,后者变为i < 999 , j < 9,从上面的代码我们可以看到,它返回0,1,这导致它进一步执行迭代。 / p>

答案 4 :(得分:0)

你内心循环中的条件:

for(j = 0; i < 999, j< 9; i++, j++) {
    // ...
}

i < 999, j< 9是否使用经常被误解的逗号运算符。表达式的计算方式是:

    评估
  • i < 999,然后忽略结果(实际上,表达式的这一部分是一个nop,因为没有副作用)
  • j < 9被评估,这是表达式的结果

如果要在表达式中使用这两个条件,则需要使用逻辑And运算符:

 i < 999 && j < 9

但是,由于i未在内循环中修改,因此没有理由在该循环的条件中检查它 - 外部循环将阻止在i < 999失败时执行内循环。