你今天过得怎么样:), 看看下面的程序,下面编写的程序是计算前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);
}
}
答案 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)减量将会发生