有人可以解释为什么以下代码中的总数= 7?用静态int sum? [关闭]

问题描述 投票:-9回答:2

有人可以解释为什么以下代码中的总数= 7?用静态int sum?

    #include <stdio.h>
    int i, j; 
    int madness(int x);
    int main(void) 
    {
    int i, total = 0;
    j = 1;
    for (i = 0; i<3; i++) { total += madness(i); }
    printf("Total = %d\n", total);
    return 0;
    }  

    int madness(int x) 
    {
     static int i;
     static int sum = 0;
     for (i = 0; i<x; i++, j++) { sum += j; }
     return sum;
     }
c++ c
2个回答
1
投票
    #include <stdio.h>
    int i, j; 
    int madness(int x);
    int main(void) 
    {
    int i, total = 0;
    j = 1;
    for (i = 0; i<3; i++) { total += madness(i); }
    printf("Total = %d\n", total);
    return 0;
    }  

    int madness(int x) 
    {
     static int i;
     static int sum = 0;
     for (i = 0; i<x; i++, j++) { sum += j; }
     return sum;
     }

第一次调用疯狂函数,i = 0;

因为静态变量只初始化一次,所以在第一次调用疯狂函数时,它在此函数中指定i = 0和sum = 0.since x = 0,因此sum的值保持不变,并返回0。

第二次调用疯狂函数,i = 1;

这里我们有x = 1,j = 1,sum = 0和函数运行循环

 for (i = 0; i<1; i++, j++) { sum += j; }

因此我们得到sum = 1并且j的值得到2现在将在下一个函数调用中使用。现在j变为2并且函数返回1.因此它被添加到我们的总数中。现在总数变为1。

第三次调用疯狂函数,i = 2;

这里x = 2,j = 2,sum = 1(从之前的调用静态值保持不变)现在你足够聪明来计算这个结果

for (i = 0; i<2; i++, j++) { sum += j; }

sum总和变为6并返回此值。因为我们以前的总值是1。现在它变成6 + 1 = 7这是你所需要的答案。


1
投票

我在代码中添加了一些调试语句,以帮助更好地理解它。

 #include <stdio.h>
 int i, j;
 int madness(int x);
 int main(void) 
    {
        int i, total = 0;
        j = 1;
        for (i = 0; i<3; i++) 
        { 
            total += madness(i); 

        printf("Total = %d\n\n", total);

    }
    return 0;
}  

int madness(int x) 
{
     static int i;
     static int sum = 0;

     for (i = 0; i<x; i++, j++) 
     { 
         printf("j is %d\n", j);
         sum += j; 
         printf("Sum is %d\n", sum);

     }
     return sum;
}

另外,打开@Yashas建议的链接,了解静态意味着什么。基本上,函数内部的局部变量在函数返回后被销毁;但是静态变量不会被破坏,每次调用函数时,总和将具有与上次相同的值。

© www.soinside.com 2019 - 2024. All rights reserved.