首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数返回值(C)

函数返回值(C)
EN

Stack Overflow用户
提问于 2016-08-15 19:12:48
回答 3查看 6.3K关注 0票数 1

我是C语言的新手(我今天开始学习它)。作为一个测试,我编写了这个程序来输出两个范围之间的所有素数。然后,我使用一些google优化和缩短了checkIfPrime函数,并将所有return语句从函数中取出,因为它显然不需要一个返回值来理解--我想让变量返回。函数如何返回flag变量,即使其中没有任何return

代码语言:javascript
复制
#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;
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2016-08-15 19:19:21

与某些语言(例如Groovy )不同,在Groovy中,函数计算的最后一个表达式是函数的返回值,在C中,您需要使用return语句显式地声明返回值。

代码语言:javascript
复制
int checkIfPrime(int n)
{
  int flag = 1;

  for (int i = 2; i <= (n / 2); i++) {
    if (n % i == 0) {
      flag = 0;
      break;
    }
  }
  return flag;
}

如果您未能显式地从期望函数返回一个值,那么您的代码将调用未定义行为

作为未定义行为的一个示例,您的原始代码为我提供了“正确的”答案,但是如果我将函数更改为:

代码语言:javascript
复制
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,如果输入210,就会得到这个

代码语言:javascript
复制
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语句,这样的事情就不会发生。

上述代码的行为方式的原因是编译器使用的实现细节。不同的编译器可能有不同的输出,或者具有不同优化设置的同一个编译器可能有不同的输出。

票数 6
EN

Stack Overflow用户

发布于 2016-08-15 19:26:07

当前函数int checkIfPrime(int n)的定义是它将返回int,因此必须返回int值。

如果您真的不想使用return语句返回一个值,则可以将该值作为指向一个变量的指针传递回来,以便将标志存储在:

代码语言:javascript
复制
void checkIfPrime(int n, int *flag) {
  *flag = 1;

  for (int i = 2; i <= (n / 2); i++) {
    if (n % i == 0) {
        *flag = 0;
        break;
    }
  }
}

使用值的返回来阅读和理解要容易得多,main将不得不更改以分配一个新变量,并且必须调用函数,然后检查变量--使用返回值要好得多。

票数 3
EN

Stack Overflow用户

发布于 2016-08-15 19:27:04

从函数中返回值的方法只有两种:显式返回值,或者变异函数外部的变量。

除了编写OO代码(在这种情况下是在变异对象字段)或void函数时,函数应该始终显式地返回一个值。

由于您为函数提供了一个返回类型,所以我很惊讶编译器没有引发错误。

您不应该试图避免使用返回语句;避免以导致代码混淆的方式使用它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38961480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档