程序将编译但不执行

时间:2016-01-30 06:53:23

标签: c gcc

我对C比较陌生,我正试图让程序运行。这是一个程序,它列出了1到1000之间的所有素数。我编译它的方法是在命令行中键入gcc Primes.c并在NppExec中运行它。

代码:

#include <stdio.h>
#include <math.h>

int x;
int bool = 1;
int y;

main() {

    for (x = 2; x <= 100; x++) {
        bool = 1;
        for (y = 0; y <= floor(x/2); y++) {
            if (x % y == 0) {
               bool = 0;    
            }
        }

        if (bool == 1) {
            printf("%d\n", x);  
        }
    }
}

我输入:

NPP_SAVE
CD $(CURRENT_DIRECTORY)
C:\MinGW32\bin\gcc.exe -g "$(FILE_NAME)" 
a

进入框然后执行。将弹出一个窗口,说a.exe已停止工作。有什么想法如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

您的代码中存在一个错误和许多小问题:

  • 您不应将xbooly定义为全局变量,而是在main函数体内定义这些变量。
  • main的原型是int main(void)int main(int argc, char *argv[])main()是一种过时的形式,C标准不再支持它。 gcc会接受它,但默认情况下不会clang。你还应该在return 0;的末尾添加main:虽然它是在C99中隐含的,但它更好的风格和更便携的旧编译器。

  • 您不应将bool用作变量名称,bool通常用作类型名称,为您的国旗命名prime

  • 您应该按照指示循环到1000

  • y <= floor(x / 2)无法按预期工作:x / 2是一个整数表达式,它已经具有您期望的值,将其传递给floor会将其转换为{{ 1}}并返回相同的值,double将自动转换为y进行比较。所有这些都是不必要的,double就足够了。 y <= x / 2floor中使用的唯一功能,您也可以删除此包含文件。

  • 请注意,您的条件会让程序执行太多迭代,您应该使用<math.h>

  • 当您计算y * y <= x,调用未定义的行为,您观察到的崩溃时,将y初始化为0将导致除以零。您必须将x % y初始化为y,因为所有数字都可以被2整除。

  • 当您检测到1是复合的时,您应该退出循环,避免不必要的迭代。

以下是更正后的版本:

x

答案 1 :(得分:1)

你有

for (y = 0; y <= floor(x/2); y++) {
    if (x % y == 0) {

您将y初始化为零,然后直接除以y(即零)。除零不起作用,它会使你的程序崩溃。

答案 2 :(得分:1)

问题是以下两行:

for (y = 0; y <= floor(x/2); y++) {
    if (x % y == 0) {

您希望2 % 0获得什么?

按照标准:

  

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

y0时,崩溃是因为Modulo运算符。

how to check if there is a division by zero in c