任何人都可以解释我所制作的节目中的错误,任何人都可以为什么不进行锻炼?

时间:2016-04-12 19:01:30

标签: c debugging

你今天过得怎么样:), 看看下面的程序,下面编写的程序是计算前n个自然数的总和,问题是我得到n-1个自然数的和,可以解释为什么?

并且任何人都可以解释为什么 - 而不是--a。

#include<stdio.h>
main()
{
    int a,sum;
    printf("Enter a number.");
    scanf("%d",&a);
    sum=sumnat(a);
    printf("Sum of the first %d natural numbers is %d.",a,sum);
}
sumnat(a)
{
    int b;
    if(a==0)
    {
        return 0;
    }
    else
    {
        b=a+sumnat(--a);
        return(b);
    }
}

4 个答案:

答案 0 :(得分:2)

有几个错误,其中最大的错误是使用a的表达式中的未定义行为以及a的修改值。您还应该正确定义函数,而不是依赖编译器提供的默认值。

#include <stdio.h>

int sumnat(int a);                  // function prototype

int main(void)                      // correct signature
{
    int a, sum;
    printf("Enter a number. ");
    scanf("%d", &a);
    sum = sumnat(a);
    printf("Sum of the first %d natural numbers is %d.", a, sum);
    return 0;
}

int sumnat(int a)                   // function has a return type and argument type
{
    if(a == 0)
    {
        return 0;
    }
    return a + sumnat(a - 1);       // there was no need to decrement `a`
}

计划会议

Enter a number. 5
Sum of the first 5 natural numbers is 15.

答案 1 :(得分:0)

您的程序适用于我,在Mac OSX上使用gcc。但是,由于这一行,它无法在任何地方使用:

b=a+sumnat(--a);

--a递减a,但如果在添加之前这样做,则结果将是错误的。我不确定C是否需要严格从左到右评估表达式(我认为不是)。无论如何,由于你不在该行之后使用a,你可以用这种方式解决问题:

b=a+sumnat(a-1);

正如@self所说,你应该修复程序以处理负值,并且最好考虑哪个是最大的自然数,你可以用这种方式计算其总和(以及为什么)。

答案 2 :(得分:0)

它们之间存在差异。另一个第一个减去a而不是进入函数,而另一个frist进入...所以它永远不会被减去,你会进入inifinit堆栈。

答案 3 :(得分:0)

“并且任何人都可以解释为什么 - 而不是--a”

当您使用前缀运算符 - a 时,减少先于其他任何操作,而后缀运算符 a - 在表达式的其余部分解析后发生,所以,让我们说,在调试代码时,在特定时刻,a = 5 自行

b=a+sumnat(--a);

正在使用运算符的前缀版本,减量将立即发生,使得a = 4然后函数sumnat将使用参数4调用

b=a+sumnat(a--);

在这种情况下正在使用后缀运算符,因此首先使用参数5调用函数sumnat,因为那是那个时刻的a的值,然后,只有当函数返回一个值时(它永远不会在你的例子中发生,因为它将被调用多次具有相同的值,永远不会达到0)减量将会发生