我的老师要求编写一个程序,使用递归函数打印每个数组元素的功能。
我的代码:
#include <stdio.h>
#include <conio.h>
void pow(int a[10],int i);
main()
{
int a[10],i,c=0;
printf("Enter 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("Power of elements in array:\n");
pow(a,c);
getch();
}
void pow(int a[10],int i)
{
if(i!=10)
{
printf("%d\n",a[i]*a[i]);
pow(a,i+1);
}
}
到目前为止,我没有遇到任何问题。但是当我将第三行pow(a,i+1)
更改为pow(a,i++)
时
输出是无数个。
任何人都可以解释一下为什么它最终会像这样? 当我将i + 1改为i ++时究竟发生了什么?
提前谢谢!
答案 0 :(得分:5)
C中有两个增量运算符:其中一个是后缀或后增量运算符,例如
i++
和其他是一元运算符或preincrement运算符,例如
++i
postincrement运算符的表达式的值是操作数在增量之前的值。因此这个电话
pow(a,i++);
相当于
pow(a,i), i = i + 1;
您可以使用preincrement运算符
代替postincrement运算符pow(a, ++i);
并且您将获得预期的结果,因为运算符的值是其增量后的操作数的值。
考虑到main应具有返回类型int
。
同样在一般情况下你的功能是错误的。它不能应用于任何数组,因为它使用幻数10。
我会按照以下方式编写函数
void pow( int a[], int n )
{
if ( n > 0 )
{
printf( "%d\n", a[0] * a[0] );
pow( a + 1, n - 1 );
}
}
并将其称为
pow( a, 10 );
在这种情况下,它可以与具有不同大小的数组一起使用。
答案 1 :(得分:1)
i++
被称为后增量,返回i
并在之后增加 。
i + 1
是一个临时文件,它会返回它所说的i + 1
,但不会更改i
自己的值。
您更改i
的值,该值仅为函数的本地。因此,递归传递给i
的{{1}}的值始终相同。
答案 2 :(得分:1)
pow(a, i+1)
传递给下一个递归调用增量值i
。 pow(a, i++)
,正在使用后增量表示法,它首先返回i
的值(非递增),从而执行具有相同值{的递归调用{1}},然后才增加它,但递增的值会丢失。因此,您的递归变为无限,因为每个调用都接收到i
的相同值。
答案 3 :(得分:0)
在您的代码中,您可以将pow(a,i++)
视为pow(a,i); i=i+1;
答案 4 :(得分:-1)
x+1
是一个等于1的表达式加上x的值。 x未修改
x++
更改评估后的值