我试图通过两种方式将int变量与函数进行比较:
将int函数的返回值存储在一个变量中,然后与另一个变量进行比较 价值。
直接比较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++;
}
}
答案 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
有几个问题。
return
块中缺少else
语句。仅此一项就使函数的输出不确定。count
是一种非常糟糕的做法-它应该在函数本地。全局时,每次调用该函数都会修改[可能]已经修改的变量。答案 3 :(得分:0)
其他人已经在这里使用全局变量解决了这个问题,因此我将不对此进行详细介绍。相反,这是一个没有全局变量的解决方案:
int countDigits(int n) {
int count = 0;
while(n>0) {
n/=10;
count++;
}
return count;
}
我猜您可能对0
是0还是1位数字很有哲理,但是您的代码暗示您希望将其设为0。如果希望将其设为1,只需将第一行更改为{ {1}}。