我是C语言的新手(我今天开始学习它)。作为一个测试,我编写了这个程序来输出两个范围之间的所有素数。然后,我使用一些google优化和缩短了checkIfPrime函数,并将所有return语句从函数中取出,因为它显然不需要一个返回值来理解--我想让变量返回。函数如何返回flag变量,即使其中没有任何return?
#include <stdio.h>
int checkIfPrime(int n);
int main(int argc, char *argv[]) {
int n1, n2;
scanf("%d %d", &n1, &n2);
for (int i = n1; i < n2; i++) {
if (checkIfPrime(i)) {
printf("%s", "Is prime: ");
printf("%d\n", i);
}
}
return 0;
}
int checkIfPrime(int n) {
int flag = 1;
for (int i = 2; i <= (n / 2); i++) {
if (n % i == 0) {
flag = 0;
break;
}
}
}发布于 2016-08-15 19:19:21
与某些语言(例如Groovy )不同,在Groovy中,函数计算的最后一个表达式是函数的返回值,在C中,您需要使用return语句显式地声明返回值。
int checkIfPrime(int n)
{
int flag = 1;
for (int i = 2; i <= (n / 2); i++) {
if (n % i == 0) {
flag = 0;
break;
}
}
return flag;
}如果您未能显式地从期望函数返回一个值,那么您的代码将调用未定义行为。
作为未定义行为的一个示例,您的原始代码为我提供了“正确的”答案,但是如果我将函数更改为:
int checkIfPrime(int n) {
int flag = 1;
for (int i = 2; i <= (n / 2); i++) {
if (n % i == 0) {
flag = 0;
break;
}
}
// this loop should have no effect
for (int i = 2; i <= (n / 2); i++) {
}
}在一个行为恰当的程序中,添加的额外循环应该没有任何效果。但是如果没有return,如果输入2和10,就会得到这个
Is prime: 2
Is prime: 3
Is prime: 4
Is prime: 5
Is prime: 6
Is prime: 7
Is prime: 8
Is prime: 9如果您在函数的末尾放置了return语句,这样的事情就不会发生。
上述代码的行为方式的原因是编译器使用的实现细节。不同的编译器可能有不同的输出,或者具有不同优化设置的同一个编译器可能有不同的输出。
发布于 2016-08-15 19:26:07
当前函数int checkIfPrime(int n)的定义是它将返回int,因此必须返回int值。
如果您真的不想使用return语句返回一个值,则可以将该值作为指向一个变量的指针传递回来,以便将标志存储在:
void checkIfPrime(int n, int *flag) {
*flag = 1;
for (int i = 2; i <= (n / 2); i++) {
if (n % i == 0) {
*flag = 0;
break;
}
}
}使用值的返回来阅读和理解要容易得多,main将不得不更改以分配一个新变量,并且必须调用函数,然后检查变量--使用返回值要好得多。
发布于 2016-08-15 19:27:04
从函数中返回值的方法只有两种:显式返回值,或者变异函数外部的变量。
除了编写OO代码(在这种情况下是在变异对象字段)或void函数时,函数应该始终显式地返回一个值。
由于您为函数提供了一个返回类型,所以我很惊讶编译器没有引发错误。
您不应该试图避免使用返回语句;避免以导致代码混淆的方式使用它们。
https://stackoverflow.com/questions/38961480
复制相似问题