c - 为什么输出是这样的?
问题描述
我必须分析这段代码,我真的不明白它是如何打印出“!”的东西。
#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
为什么函数不在“!”处停止?
解决方案
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次执行,两者
--
取消p和i的++
递归调用参数中的v[3]
- 回到f的第3次执行,两者
--
取消p和i的++
递归调用参数中的v[2]
- 回到f的第2次执行,两者
--
取消p和i的++
递归调用参数中的v[1]
- 回到f的第一次执行,两者
--
取消p和i的++
递归调用参数中的v[0]
所以程序打印! BENE
推荐阅读
- c - 在链表中出现分段错误(核心转储)
- php - 需要具有自定义 Woocommerce 订单状态的批量状态更改功能
- c# - 使用表单 C# 将行添加到数据网格视图
- python - 散景:使用按钮单击从多个滑块更新
- git - GIT - 仅在不更改 .gitignore 文件的情况下忽略本地环境中的一些签入文件
- python - 为什么 python JSON 模块显示错误:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
- python - 正则表达式提取整数或浮点值,后跟一个单位,Python
- arrays - VBA Array函数将具有简单类型的变量转换为值并且不存储变量引用
- javascript - appendFile() 在 readFile() 之前运行,即使 appendFile() 按时间顺序在 readFile() 之后
- angular - 如何使用 nameFormControl 从 datepicker angular-material 和 Reactive Form 格式化日期?角 6