【问题标题】:break in side for loop -after break statement not printing anything outside the for loopbreak in side for 循环 - 在 break 语句之后不打印 for 循环之外的任何内容
【发布时间】:2016-12-22 10:14:42
【问题描述】:

为什么以下 for 循环在第一次迭代之后不执行 任何人都可以帮助我解决这个问题。 提前致谢。

输出:

输入数字范围

输入第一个数字:2

输入最后一个数字:30

2 到 30 之间的非质数是:

.start for 循环......i=2

.p....=3

for 循环结束:i....=2

.start for 循环......i=3

在此之后,for 循环不再执行。为什么?

#include <stdio.h>

int main(void)
{

    int start, end, i, remain, k, p, count = 0;
    printf("\nEnter the Range of Numbers\n\n");
    printf("Enter the First Number: ");
    scanf("%d", &start);
    printf("Enter the Last Number: ");
    scanf("%d", &end);

    int flag;
    printf("The non-prime numbers between %d and %d are:\n", start, end);
    for (i = start; i <= end; i++)
    {
        printf("\n.start for loop...............i=%d\n", i);
        // p = 2;
        for (p = 2; p<i;)
        {
            remain = i%p;
            if (remain == 0)
                break;
            //p++;
        }
        p++;
        printf("\n.p....=%d \n", p);

        if (i == p)
            //  if(remain==0)
        {
            printf("%d ", i);
            count++;
        }
        printf("\n end of for loop: i....=%d\n", i);
    }
    printf("\n............\n");
}

【问题讨论】:

  • p 看起来您试图在它控制的循环内对其进行修改,但由于某种原因选择将其注释掉。 //p++; - 那么inside那个循环会ever导致条件p&lt;ifalse
  • @WhozCraig 在 for (p = 2; p
  • 你现在在整个循环之外增加它。 IE。如果曾经在 (a) p &lt; i 和 (b) i%p != 0 的位置输入该循环,则它是无限的。 for 循环条件和内部的任何中断条件都不会导致循环中断; 永远。运行这是一个调试器,单步执行该循环。它将显示我所描述的内容。
  • i 为2 时,循环为for (p=2; p&lt;2;),因此跳过循环。当i 为3 时,循环为for(p=2; p&lt;3;),为无限循环。
  • @user3386109 我认为在“当 i 为 2 时,循环是 for (p=2; p

标签: c for-loop conditional-statements break


【解决方案1】:

试试这个代码:

int start, end, i, remain, k, p, count = 0;
printf("\nEnter the Range of Numbers\n\n");
printf("Enter the First Number: ");
scanf_s("%d", &start);
printf("Enter the Last Number: ");
scanf_s("%d", &end);


int flag;
printf("The non-prime numbers between %d and %d are:\n", start, end);
for (i = start; i <= end; i++)
{
    //printf("\n.start for loop...............i=%d\n", i);
    for (p=1;p<i;p++) 
    {
        if (p > 1 && i%p == 0) 
        {
            printf("%d ", i);
            count++;
            break;
        }
    }
    //printf("\n end of for loop: i...............d\n", i);
}
printf("\n............\n");

它保留了我假设您正在尝试做的事情。我已经评论了打印语句的噪音,并且count++ 似乎没有在任何地方使用。您可以将for 循环减少为:

printf("The non-prime numbers between %d and %d are:\n", start, end);
for (i = start; i <= end; i++)
{
    for (p=1;p<i;p++) 
    {
        if (p > 1 && i%p == 0) 
        {
            printf("%d ", i); 
            break;
        }
    }
}
printf("\n............\n");

【讨论】:

  • @@Ashwin Nair 感谢您的帮助,但基本上是在尝试打印复合数字
  • @kumar,现在已修复。之前一直在寻找素数。现在正在寻找合数。
【解决方案2】:

让我们考虑p = 2i = 5。那么这个循环会发生什么

for (p = 2; p<i;)
    {
        remain = i%p;
        if (remain == 0)
            break;
        //p++;
    }

第一行 >> 它运行 for 循环。 第二行>>remain = i%p。 i = 5 & p = 2。所以剩下 = 5%2 = 1。 第 3 行 >> 剩余不是零。所以if(remain == 0) 返回 false。 然后它从第一行再次开始工作。所以这个循环就像一个无限循环一样工作。

【讨论】:

    【解决方案3】:

    你的循环代码

        for (p = 2; p<i;)
        {
            remain = i%p;
            if (remain == 0)
                break;
            //p++;
        }
    

    不完整。

    pfor 语句中不可更改,而正文中的p++ 已被注释。结果你可能会有无限循环。

    考虑以下更改:

        remain = 1;
        for (p = 2; p<i && remain; p++)
        {
            remain = i % p;
        }
    

    甚至(没有remain

    for (p = 2; p < i && i%p; p++); 
    

    【讨论】:

    • @@VolAndit 似乎陷入了无限循环。谢谢你的帮助。
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2017-06-09
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多