This question already has answers here:
Why are these constructs using pre and post-increment undefined behavior?

(14个回答)


4年前关闭。




我是该社区的新手,我试图了解为什么此递归函数没有得到堆栈溢出,当我在函数调用中使用后递增(c++)时,该值传递0(我看到那当我调试),但当下一个函数被调用时,它的值为1。
我不明白什么时候应用后增量,以及为什么如果im传递给函数的值0,在第一个参数是做s + 1;
#include <stdio.h>
#include <string.h>
#define LARGO 20

char *esta (char s[], int c){
 if(strlen(s))
    printf("\n %s", esta(s+c,c++));
 return s;
}

int main()
{
 char cad[LARGO]= {"hello"};
 int c=0;
 printf("\n %s", esta(cad,c++));
}

P.S. :对不起,如果我的英语不是最好的话,那不是我的主要语言,我会尽力解释。如果不清楚,请告诉我,然后我将其更改。

最佳答案

参见维基百科Sequence point。特别是项目4给出了完整的解释:

换句话说:分配编译器在这里要做艰巨的工作。它必须传递POST增量之前的原始值(因为这是POST增量的工作方式),并同时在输入函数esta之前执行所有副作用。在这些副作用中,增加c的值。而且,由于未指定参数的求值顺序,因此会发生这种情况,以便编译器首先求c++的值,然后再求s+c的值,在这种情况下,这意味着s+1。因此,当您退出递归并在每次迭代中打印字符串余数时,您的行越来越短,最终变成strlen(s)==0

09-04 23:06
查看更多