繁体   English   中英

有人可以解释我制作的程序中的错误吗,有人可以解释为什么我不锻炼吗?

[英]Can anybody explain the error in the program i made, can anybody why i didn't workout?

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

谁能解释a-而不是-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);
    }
}

有几个错误,这其中最大的是它采用的表达不确定的行为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.

您的程序对我有用,在Mac OSX上使用gcc。 但是,由于以下原因,它不会在所有地方都有效:

b=a+sumnat(--a);

--a减小a ,但是如果在添加之前这样做,则结果将是错误的。 我不确定严格按从左到右的方式来计算表达式是否需要C(我认为不是)。 无论如何,由于您无需在该行之后使用a ,因此可以通过以下方式解决问题:

b=a+sumnat(a-1);

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

它们之间有区别。 函数a和a的第一个小数将进入函数,而另一个frist则进入该函数,因此它永远不会被分动,然后转到inifinit堆栈。

“而且任何人都可以解释为什么用a代替a”

the decrease is done before anything else, while the postfix operator happens after the rest of the expression is resolved, so, lets say, while debugging your code, in a particular moment, a = 5 since the line 当您使用前缀操作的下降是任何事情之前完成,而表达的休息后发生后缀运算符得到解决,因此,可以说,在调试的代码,在一个特定的时刻,一个自线= 5

b=a+sumnat(--a);

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

b=a+sumnat(a--);

在这种情况下,将使用postfix运算符,因此首先将使用参数5调用sumnat函数,因为那是那一刻的a值,然后仅当函数返回值时(在您的函数中永远不会发生)例如,由于将使用相同的值多次调用它,所以永远不会达到0)递减会发生

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM