全局变量没有正确递增

时间:2013-11-16 17:42:25

标签: c global

int count;
int main(){
count=0;

    printf("%6d\t    %6d\t    %6d\t ",i+1,multiFib(i),count);
}

int multiFib(int x){

if (x<2){
    return 1;
    count++;
}}

在此代码中,count始终给出0结果。我把它变成了一个全局变量,而不是再次在函数中定义它。如何增加该变量?

按顺序输出;那不是问题。它给出了结果:

1    1 0
-

2    1 0
-

3    2 0

所以,count没有增加 - 但为什么呢?

5 个答案:

答案 0 :(得分:4)

虽然不能保证评估顺序(参见其他多个答案),但还有另一个更基本的问题(实际上是其中两个):

int multiFib(int x)
{
    if (x<2){
        return 1;
        count++;
    }
}
  1. 您从函数返回后尝试增加count。您的编译器应警告无法访问的代码。
  2. 当输入大于2时,您不会从multiFib()返回值。
  3. 您展示的main()片段引用了未定义的变量i。我假设这是因为您从for (i = 0; i < 40; i++)语句之前删除了printf()循环。要修复“评估顺序”问题,您可能需要使用:

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

    这会评估每次调用该函数时对multiFib()的调用次数。

    对于multiFib()函数本身,您可能需要:

    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
    

    请注意,如果你超过40,你开始得到算术溢出。它也会非常(非常,非常)慢。

答案 1 :(得分:3)

此:

if (x<2){
    return 1;
    count++;
}

在增加计数之前从函数返回。所以它永远不会增加。

返回不只是设置返回的值。它实际上退出了该功能。

只需交换这两行的顺序即可。此外,您应该密切关注编译器警告。任何体面的编译器都会警告您count++;无法访问

答案 2 :(得分:1)

printf("%6d\t    %6d\t    %6d\t ",i+1,multiFib(i),count);

在C中未指定函数参数评估的顺序。multiFib可以在count函数调用中printf之前或之后进行评估。

答案 3 :(得分:1)

未指定函数参数的评估顺序。 在您的代码中,

printf("%6d\t    %6d\t    %6d\t ",i+1,multiFib(i),count);

打印printf后可能会调用multiFib(i)函数count的参数。

试试这个,

printf("%6d\t",multiFib(i));
printf("%6d\t    %6d\t ",i+1,count);

检查结果。

答案 4 :(得分:1)

正如在另一个答案中所说,问题是没有指定函数参数的评估顺序,所以在你的例子中:

printf("%6d\t    %6d\t    %6d\t ",i+1,multiFib(i),count);

在将count传递给multiFib(i)函数之前或之后,您无法确定是否会对printf()进行评估。

请提供look here以获取有关C ++评估顺序或here for evaluation order in C的详细信息。

通过将printf分成两个调用来强制执行评估顺序,您可能会觉得很有用:

printf("%6d\t",multiFib(i));
printf("%6d\t    %6d\t ",i+1,count);
像Nishith Jain M R在他的回答中建议的那样。