首页 > 解决方案 > 为什么输出是这样的?

问题描述

我必须分析这段代码,我真的不明白它是如何打印出“!”的东西。

#include <stdio.h>

int f(int i, int *v, char* p){
    int x;
    if(strlen(p)>0){
        x=f(++i,v,++p);
        printf("%c", *(--p)-*(v+(--i)));
    }else
    printf("! ");
    return x;
}

int main(){
    int v[4]={3,1,2,4}, a=3124;
    char k[5]="HOGF";
    char *p=k;
    a=f(0,v,p);
    return 0;
    
}

预期的输出是

!BENE

为什么函数不在“!”处停止?

标签: cstringpointersrecursionstack

解决方案


f返回的值是未定义的,因为它是未初始化变量x的“值” ,但该值从未“真正”使用过。

Why doesn't the function stop at " ! "

因为字符串“HOGF”中的代码一直到达结束空字符,在这种情况下strlen是 0,显然不是>0“!”是打印,所以递归调用被“弹出”产生其他字符的打印。

详细地 :

  • 在第一次从main执行f时,变量p指向“HOGF”并且i值为 0,字符串不为空,因此递归调用
  • 2次p指向“OGF”,i值为1,字符串不为空,所以递归调用
  • 3次p指向“GF”,i值为2,字符串不为空,所以递归调用
  • 4次p指向“F”,i值为3,字符串不为空,所以递归调用
  • 5 次p指向 "" 并且i值为 4,strlen(p)>0是 false 所以 "!" 是打印
  • 回到f的4次执行,两者--取消pi++递归调用参数中的v[3]
  • 回到f的3次执行,两者--取消pi++递归调用参数中的v[2]
  • 回到f的2次执行,两者--取消pi++递归调用参数中的v[1]
  • 回到f的一次执行,两者--取消pi++递归调用参数中的v[0]

所以程序打印! BENE


推荐阅读