【问题标题】:static variable doesn't increment in this code using recursion使用递归,此代码中的静态变量不会递增
【发布时间】:2017-08-01 14:25:21
【问题描述】:

为什么静态变量a的值即使在return语句之后也不递增?

#include<stdio.h>
int p(int x);
int main()
{   
  int r=p(4);
  printf("%d",r);
  return 0;
}

int p(int x)
{
  static a=1;
  printf(" x = %d,a= %d\n",x,a);

  if(x<=1)
  {
    return 1;
  }
  else
  {
    printf(" x = %d,a= %d\n",x,a);    
    return p(x-1)+x+a++;
    printf(" x = %d,a= %d\n",x,a);    
  }
}

在这里,当我打印静态变量 a 时,它的值始终为 1。但根据我读到的理论,它应该在每次递归调用后递增。

【问题讨论】:

  • 什么是静态a?我认为这将是静态 int a ..
  • static变量的默认数据类型为int
  • 注意:return p(x-1)+x+a++; 后面的printf(" x = %d,a= %d\n", x, a); 无关紧要。

标签: c recursion output increment


【解决方案1】:

表达式p(x-1) + x + a++ 的求值顺序未指定。我们知道所有三个操作数在求和之前求值之前求值,但我们不知道它们的求值顺序是什么(由编译器决定)。在您的情况下,编译器首先评估p(x-1),因此递归函数调用中a 的值始终为1,并且仅在您的程序从所有递归调用返回后才会更改。

【讨论】:

【解决方案2】:

递增函数在变量a 的后递增之前返回。从逻辑上讲,第二个printf 语句不应打印。

【讨论】:

  • NMDV,但我认为这是 DV,因为不清楚 printf() 之前的 return 无论如何都不会打印 a 的更新值。 (如,投票者可能没有意识到这实际上回答了问题。)
  • @JohnBollinger 这个答案不正确。 a++ 的函数调用和求值,并不确定排序。顺序未指定,行为已定义。在此处查看非常相似的示例:stackoverflow.com/questions/41775973/… 和此处:stackoverflow.com/questions/40532404/…
  • @2501, this 答案与 a++ 相对于函数调用的顺序无关。它指出实际执行的 printf() 在每个递归调用中都发生在任何一个之前,因此只有在程序的整体行为未定义的意义上,它才能看到与 1 不同的 a 的值。跨度>
【解决方案3】:

首先注意到return 之后的代码永远不会被执行。所以这个代码块:

printf(" x = %d,a= %d\n",x,a);    
return p(x-1)+x+a++;
printf(" x = %d,a= %d\n",x,a);  <--- will never be executed!!

真的和

一样
printf(" x = %d,a= %d\n",x,a);    
return p(x-1)+x+a++;

当您发现一段代码的行为奇怪/难以理解时,将复杂表达式重写为多个简单表达式通常是个好主意。

此声明:

return p(x-1)+x+a++;

可以改写为:

int sum = 0;
sum = sum + p(x-1);  // Here you call the function again
sum = sum + x;
sum = sum + a;
a = a + 1;           // Here you increment a
return sum;

当您查看重写的代码时,很明显p 的递归调用发生在a 的增量之前。因此,a 的所有打印都在增量之前,因此将打印1

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多