我写了这段代码:
#include <stdio.h>
int main() {
printf("Works");
int base = 1;
do {
if (base > 1) {
for (int i = 0; i <= base; i++) {
if ((base % i) == 0) {
break;
} else {
printf("%d ", base);
}
}
}
base += 1;
} while (1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它编译完美,但是当我运行它时,终端刚刚关闭,我不知道如何调试它,因为我对用 c 编写程序非常陌生。
编辑:这应该永远生成素数。
你的问题在这里:
for (int i = 0; i <= base; i++)
{
if ((base % i) == 0)
...
Run Code Online (Sandbox Code Playgroud)
第一次迭代产生一个模数0,这是未定义的行为。在您的情况下,您的程序崩溃了。
模运算符的右侧为零,这是未定义的行为:
/ 运算符的结果是第一个操作数除以第二个操作数的商;% 运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为未定义。
旁注:您没有看到任何内容,printf因为它是缓冲的——出于历史/性能原因,它不会直接打印到控制台。通常它是行缓冲,因此添加一个新行\n到printf行应迫使缓冲打印出到控制台。
在第一次迭代中,以下语句:
if ((base % i) == 0)
Run Code Online (Sandbox Code Playgroud)
相当于
if ((base % 0) == 0)
^^^
Run Code Online (Sandbox Code Playgroud)
这会导致除以零,(在我的环境中确切的词。)在C语言中意味着未定义的行为,这反过来意味着任何事情都可能发生。在您的情况下,会导致程序崩溃。具有讽刺意味的是,这大约是您可以使用 UB 获得的绝对最佳结果之一。绝对最糟糕的事情是它似乎有效。(然后你会有一个定时炸弹错误,等待在某个意想不到的时间发生。)
解决方法只是注意您的初始条件。
for (int i = 0; i <= base; i++)
for (int i = 1; i <= base; i++)
^^^
Run Code Online (Sandbox Code Playgroud)