C 全局变量未正确递增
所以,C 全局变量未正确递增,c,global,C,Global,所以,count没有增加——但为什么 1 1 0 - 2 1 0 - 3 2 0 C中未指定函数参数的求值顺序。multiFib可以在printf函数调用中的count之前或之后求值。未指定函数参数的求值顺序。 在代码中 printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count); 打印count后可能会调用printf函数multiFib(i)的参数 试试这个 printf("%6d\t %6d\t %
count
没有增加——但为什么
1 1 0
-
2 1 0
-
3 2 0
C中未指定函数参数的求值顺序。
multiFib
可以在printf
函数调用中的count
之前或之后求值。未指定函数参数的求值顺序。
在代码中
printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count);
打印count
后可能会调用printf
函数multiFib(i)
的参数
试试这个
printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count);
检查结果。正如另一个答案中所述,问题在于没有指定函数参数的求值顺序,因此在您的示例中:
printf("%6d\t",multiFib(i));
printf("%6d\t %6d\t ",i+1,count);
您无法确定在将multiFib(i)
传递到printf()
函数之前或之后是否会计算count
请参阅关于C++中的评价顺序的更多详细信息,或
通过将printf
分为两个调用,强制执行求值顺序也会很有用:
printf("%6d\t %6d\t %6d\t ",i+1,multiFib(i),count);
正如Nishith Jain M R在其回答中所建议的那样。尽管评估顺序无法保证(参见其他多个答案),但还有另一个更基本的问题(实际上,其中两个): 这将计算每个顶级函数调用对
multiFib()
的调用次数
对于multiFib()
函数本身,您可能需要:
int count;
int main(void)
{
for (int i = 0; i < 40; i++)
{
count = 0;
int fib = multiFib(i);
printf("%3d %10d %10d\n", i+1, fib, count);
}
return(0);
}
请注意,如果超过40,则开始出现算术溢出。它也变得非常(非常、非常)慢。这:
1 0 1
2 1 1
3 1 3
4 2 5
5 3 9
6 5 15
7 8 25
8 13 41
9 21 67
10 34 109
11 55 177
12 89 287
13 144 465
14 233 753
15 377 1219
16 610 1973
17 987 3193
18 1597 5167
19 2584 8361
20 4181 13529
21 6765 21891
22 10946 35421
23 17711 57313
24 28657 92735
25 46368 150049
26 75025 242785
27 121393 392835
28 196418 635621
29 317811 1028457
30 514229 1664079
31 832040 2692537
32 1346269 4356617
33 2178309 7049155
34 3524578 11405773
35 5702887 18454929
36 9227465 29860703
37 14930352 48315633
38 24157817 78176337
39 39088169 126491971
40 63245986 204668309
if(x请在这里提问时多注意写作。有答案吗?全局变量不会递增。复制粘贴一条错误消息,告诉您展开问题以便这样做是引起负面注意的最可靠方法。您可以确保multiFib(i)的值
在打印count
的值之前求值;您不能确定的是count
参数是在multiFib(i)
参数到printf()之前还是之后求值
。我只能给出+1…很好的观察结果…即使我回答了,但我没有观察到这些事情…@NishithJainMR:我没有注意到额外的问题,直到OP发布了哀怨的“任何答案?全局变量不递增”注释,而当时已经有三个答案给出了相同的(精确到目前为止)分析。
int multiFib(int x)
{
if (x<2){
return 1;
count++;
}
}
int count;
int main(void)
{
for (int i = 0; i < 40; i++)
{
count = 0;
int fib = multiFib(i);
printf("%3d %10d %10d\n", i+1, fib, count);
}
return(0);
}
int multiFib(int x)
{
count++;
if (x < 2)
return x;
else
return multiFib(x-1) + multiFib(x-2);
}
1 0 1
2 1 1
3 1 3
4 2 5
5 3 9
6 5 15
7 8 25
8 13 41
9 21 67
10 34 109
11 55 177
12 89 287
13 144 465
14 233 753
15 377 1219
16 610 1973
17 987 3193
18 1597 5167
19 2584 8361
20 4181 13529
21 6765 21891
22 10946 35421
23 17711 57313
24 28657 92735
25 46368 150049
26 75025 242785
27 121393 392835
28 196418 635621
29 317811 1028457
30 514229 1664079
31 832040 2692537
32 1346269 4356617
33 2178309 7049155
34 3524578 11405773
35 5702887 18454929
36 9227465 29860703
37 14930352 48315633
38 24157817 78176337
39 39088169 126491971
40 63245986 204668309
if (x<2){
return 1;
count++;
}