为什么我们不能将int变量与c中的int返回类型函数进行比较?

时间:2018-07-26 11:43:09

标签: c function

我试图通过两种方式将int变量与函数进行比较:

  1. 将int函数的返回值存储在一个变量中,然后与另一个变量进行比较 价值。

  2. 直接比较int变量和函数调用。

在这里,我得到了第一个答案,而第二个却没有。

为什么会这样?

我的代码:

#include < stdio.h >

int count = 0;
int countDigits(int);

int main() {

  int i;
  int result = countDigits(435);
  for (i = 0; i < result; i++) {

    printf("id %d\n", 3);
  }
  for (i = 0; i < countDigits(435); i++) {

    printf("i =%d\n", i);
  }
}

int countDigits(int n) {

  if (n == 0) {
    return count;
  } else {
    countDigits(n / 10);
    count++;
  }
}

4 个答案:

答案 0 :(得分:4)

我们可以。

只是您的函数有逻辑错误。对其进行调试,就可以了。

启用编译器警告将对您有所帮助。例如,使用GCC和Wall标志,您将得到:

prog.c: In function 'countDigits':
prog.c:32:1: warning: control reaches end of non-void 
function [-Wreturn-type]
 }
 ^

提示:想想如果n我们不为零,您的函数会做什么。

答案 1 :(得分:3)

  • count是全局变量。

  • 函数countDigits(n) n 中的小数位数添加到count

    • 如果 n 为零,则返回1。

    • 如果 n 不为零,则返回值不确定。

由于countDigits(435)的值未定义,所以任何事情都可能发生,并且不需要进一步分析。

让我们假设通过在return count;之后插入count++;可以纠正此明显的错误。在这种情况下,该函数将返回递增的count

  • 所以我们有一个不错的顺序:

    • result设置为countDigits(435)

    countDigits(435)将3加到count并返回3。

    • i设置为0,然后与countDigits(435)进行比较。

    countDigits(435)将3加到count并返回6。0小于6,因此for循环继续。

    • 现在i是1,我们将其与countDigits(435)进行比较。

    countDigits(435)将3加到count并返回9。1小于9,因此for循环继续。

    • 现在i是2,我们将其与countDigits(435)进行比较。

    countDigits(435)将3加到count并返回12。2小于12,因此for循环继续。

...等等。

道德:

  • 当心副作用。除非有充分的理由,否则请勿使用和修改全局变量。

  • 当您必须使用副作用时,请在您的脑海中突出它们。

答案 2 :(得分:1)

可以直接将变量与函数的输出进行比较。但是,您的函数countDigits有几个问题。

  1. 并非所有代码路径都返回值-您在return块中缺少else语句。仅此一项就使函数的输出不确定。
  2. 这在算法上不正确。您是否尝试过调试?只需从为不同输入打印输出开始,您将看到。
  3. 在该函数内部修改并返回全局变量count是一种非常糟糕的做法-它应该在函数本地。全局时,每次调用该函数都会修改[可能]已经修改的变量。

答案 3 :(得分:0)

其他人已经在这里使用全局变量解决了这个问题,因此我将不对此进行详细介绍。相反,这是一个没有全局变量的解决方案:

int countDigits(int n) {
    int count = 0;
    while(n>0) {
        n/=10;
        count++;
    }
    return count;
}

我猜您可能对0是0还是1位数字很有哲理,但是您的代码暗示您希望将其设为0。如果希望将其设为1,只需将第一行更改为{ {1}}。