我对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
已停止工作。有什么想法如何解决这个问题?
答案 0 :(得分:3)
您的代码中存在一个错误和许多小问题:
x
,bool
和y
定义为全局变量,而是在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 / 2
是floor
中使用的唯一功能,您也可以删除此包含文件。
请注意,您的条件会让程序执行太多迭代,您应该使用<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 - /运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为未定义。
当y
为0
时,崩溃是因为Modulo运算符。