C语言:递归函数中x + 1和x ++之间的区别?

时间:2015-04-02 14:14:14

标签: c recursion

我的老师要求编写一个程序,使用递归函数打印每个数组元素的功能。

我的代码:

#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 ++时究竟发生了什么?

提前谢谢!

5 个答案:

答案 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)传递给下一个递归调用增量值ipow(a, i++),正在使用后增量表示法,它首先返回i的值(非递增),从而执行具有相同值{的递归调用{1}},然后才增加它,但递增的值会丢失。因此,您的递归变为无限,因为每个调用都接收到i的相同值。

答案 3 :(得分:0)

在您的代码中,您可以将pow(a,i++)视为pow(a,i); i=i+1;

答案 4 :(得分:-1)

x+1

是一个等于1的表达式加上x的值。 x未修改

x++

更改评估后的值