许许多多O_o 发表于 2023-5-24 11:53:56

这个break语句放这为啥会报错?求大佬解释一下谢谢!!

int main(void)
{
    long long i,num;
    _Bool flag=1;

    printf("请输入一个数:\n");
    scanf("%11d",&num);

    for(i=2;i<=num/2;i++);
    {
      if(num%i==0)
      {
            flag=0;
            break;      //<------------------------------------------------------------在这报错:main.c|33|error: break statement not within loop or switch|
      }

    }

    if(flag)
    {
      printf("%-11d是素数!\n",num);
    }
    else
    {
      printf("%-11d不是素数!\n",num);
    }

    return 0;
}

isdkz 发表于 2023-5-24 12:02:45

你的代码中的错误是在for循环语句的结束处。你使用了分号( ; ),这会导致循环主体为空。因此, break 语句实际上并不在任何循环或开关(switch)语句内部,这就是为什么你收到这个错误信息。

正确的代码应该是这样的:

int main(void)
{
    long long i,num;
    _Bool flag=1;

    printf("请输入一个数:\n");
    scanf("%11lld",&num);

    for(i=2;i<=num/2;i++)   // 删除这里的分号
    {
      if(num%i==0)
      {
            flag=0;
            break;
      }

    }

    if(flag)
    {
      printf("%-11lld是素数!\n",num);// 注意这里也要改为 %lld
    }
    else
    {
      printf("%-11lld不是素数!\n",num);// 注意这里也要改为 %lld
    }

    return 0;
}

注意,你在printf和scanf中的格式说明符应该与变量的类型相匹配。在你的代码中, num 的类型是 long long ,因此你应该使用 %lld ,而不是 %d 。在C语言中, %d 用于 int 类型,而 %lld 用于 long long int 类型。

sfqxx 发表于 2023-5-24 20:16:30

本帖最后由 sfqxx 于 2023-5-24 20:20 编辑

这是因为在 for 循环的末尾加了一个分号,导致 for 循环成为了一个空循环,而紧接着的 break 语句实际上并不在任何循环或 switch 语句中,因此才会编译错误。

具体来说,在 for 循环中,分号一般用来分隔三个部分,即循环变量的初始化、循环条件和循环变量的更新操作。而在 for 循环的第一个分号后面放置了一个空语句(即什么也没做的语句),使得循环体为空,因此后面的 break 语句也变成了独立的语句,不再属于任何循环或 switch 语句。

要解决这个问题,只需要去掉 for 循环语句末尾的分号即可,代码修改如下:
for (i = 2; i <= num / 2; i++) {
    if (num % i == 0) {
      flag = 0;
      break;
    }
}

注意到我还把循环变量的更新操作由原来的分号改成了 i++,这样才能让程序正确执行循环体。

还有应该用%lld
        if(flag)
        {
                printf("%-11lld是素数!\n",num);
        }
        else
        {
                printf("%-11lld不是素数!\n",num);
        }


有用请设置最佳答案
页: [1]
查看完整版本: 这个break语句放这为啥会报错?求大佬解释一下谢谢!!