有人可以解释为啥以下代码中的总 = 7 吗?与静态整数总和? [关闭]

Posted

技术标签:

【中文标题】有人可以解释为啥以下代码中的总 = 7 吗?与静态整数总和? [关闭]【英文标题】:Can someone explain why is the total = 7 in the following code? with static int sum? [closed]有人可以解释为什么以下代码中的总 = 7 吗?与静态整数总和? [关闭] 【发布时间】:2017-12-28 12:31:41 【问题描述】:

有人可以解释为什么以下代码中的总数 = 7 吗?与静态整数总和?

    #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;
     

【问题讨论】:

What does "static" mean in C?的可能重复 你有没有用调试器单步调试代码,检查变量值? 真是浪费时间。你的老师应该感觉不好。 至少这可以教会人们如何做事。 @klutt 输出为“Total = 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", 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 的 madness 函数;

因为静态变量只初始化一次,所以在第一次调用 ma​​dness 函数时它分配 i=0 和 sum=0.since x=0 在这个函数中所以 sum 的值保持不变并且它返回 0。

第二次调用 i=1 的 madness 函数;

这里我们有 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 的 madness 函数;

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

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

这里 sum 变成 6 并返回这个值。因为我们之前的 total 值是 1 。现在它变成了 6+1=7 这是你需要的答案。

【讨论】:

谢谢。这是否意味着“总”在第三次调用中保留 1 的值,即使它没有分配静态 是的,'total' 不是一个静态变量。当你调用一个函数'madness'时,就像你保存了 main 函数的当前实例并控制了'madness'函数以及函数何时结束然后主函数再次获得控制权。明白了吗?【参考方案2】:

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

 #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 建议的链接以了解静态的含义。基本上,函数内部的局部变量在函数返回后被销毁;但是静态变量不会被销毁,每次调用该函数时,总和将具有与上次相同的值。

【讨论】:

以上是关于有人可以解释为啥以下代码中的总 = 7 吗?与静态整数总和? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

预期时间复杂度为 O(n^2),但结果为 O(n)。有人可以解释为啥吗?

有人可以解释以下 javascript 代码吗?

有人可以解释为啥我的最后一个 else 语句不会运行吗?

有人可以解释为啥条件运算符和赋值运算符一起使用时表现奇怪吗?

以下等式在 python x=4**3**5**7 中如何工作。有人可以解释一下它的执行顺序吗? [复制]

有人可以解释为啥会出现这个错误吗?