当我使用调试器时,我可以告诉退出没有退出该功能。我使用退出功能错了吗? (我必须)我该如何解决这个问题?
int is_prime(int x,char array[]){
int divider = (x-1);
float test;
while(x>-1){
test = isdigit((x % divider)); //isdigit returns !0 if digit
if(divider == '1'){
return(1); //if divider reaches 1 then the number is prime
exit;
}
if(test == '0'){
return (0);//not prime
exit;
}
divider--;
}
}
答案 0 :(得分:5)
函数的名称本身(后面没有括号)只是为您提供函数的地址而不调用它。在C中,最基本的语句是一个表达式,它的副作用被评估,表达式的结果值被忽略。因此,像exit;
或3;
这样没有副作用的声明是合法的,但实际上并没有做任何事情,也可能被删除。有些编译器会给你关于这些毫无意义的语句的警告,尽管你可能需要打开额外的诊断警告来获取它们。使用这些选项(例如-Wall
gcc
)是一个非常好的主意,可以帮助您避免这样的陷阱。
答案 1 :(得分:2)
你必须打电话给它:
exit(0);
另外,如果你在返回之后放置它,它将永远不会被调用,因为return从函数返回。
编辑:而且,正如其他人所说,退出退出程序,所以你可能不想在这里使用退出。
答案 2 :(得分:1)
阅读exit(3)
手册。
答案 3 :(得分:1)
声明:
exit;
向GCC发出以下警告:
C:\temp\test.c:71: warning: statement with no effect
发生的事情是你有一个表达式来计算exit()
函数的地址 - 但该表达式实际上并没有对该地址做任何事情。它类似于你有如下声明:
1 + 2;
这是有效的C,但它对任何事都没有影响。
要调用函数as Thomas Padron-McCarth said,您必须拥有参数列表(即使它们对于某些函数是空的):
exit(0);
答案 4 :(得分:1)
除了return
和exit
的错误之外,你在使用整数和字符的方式上也有一个错误。 isdigit
是一个仅应用于字符的函数,如果字符在'0'
和'9'
之间,则为true,但是应该知道C中的字符符号只是一种奇特的方式编写代码点(大多数时候是ASCII)。因此,当您在C程序中编写'1'
时,编译器将看到49
,如果您编写'a'
编译器实际看到97
。这意味着isdigit
将值true
返回48
到57
,可能不是您想要的。在您将divider
与'1'
进行比较的行中,实际上您将其与49
进行比较(IBM大型机除外,其中'1'
为241
)
你的循环是无限的,它取决于x的值,但x在循环中没有改变,因此while中的条件永远不会改变。
编辑:这里是更正后的代码
int is_prime(uint_t x)
{
uint_t divider;
if(x <= 3)
return 1;
for(divider = x-1; ; divider--) {
if(x % divider == 0)
return 0; //not prime
if(divider == 1)
return 1; //if divider reaches 1 then the number is prime
}
}
答案 5 :(得分:0)
exit
退出进程,而不是函数。你想要return
。