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++;
}