程序立即停止在 C 中?

Cha*_*box -1 c

我写了这段代码:

#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 编写程序非常陌生。

编辑:这应该永远生成素数。

Fid*_*its 5

你的问题在这里:

for (int i = 0; i <= base; i++)
{
    if ((base % i) == 0)
    ...
Run Code Online (Sandbox Code Playgroud)

第一次迭代产生一个模数0,这是未定义的行为。在您的情况下,您的程序崩溃了。


Ret*_*ine 5

模运算符的右侧为零,这是未定义的行为:

/ 运算符的结果是第一个操作数除以第二个操作数的商;% 运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为未定义。

  • C 标准,第 6.5.5 条 [ISO/IEC 9899:2011]

旁注:您没有看到任何内容,printf因为它是缓冲的——出于历史/性能原因,它不会直接打印到控制台。通常它是行缓冲,因此添加一个新行\nprintf行应迫使缓冲打印出到控制台。


ryy*_*ker 5

在第一次迭代中,以下语句:

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)