我正在查看我遇到的以下代码,用于在 C 中使用递归以相反顺序打印字符串:
void ReversePrint(char *str) { //line 1
if(*str) { //line 2
ReversePrint(str+1); //line 3
putchar(*str); //line 4
}
}
我是 C 的新手,对第 2 行感到困惑。*str
根据我的理解是取消引用指针,应该返回当前位置的字符串值。但是如何将其用作条件语句的参数( bool 值除外?)?在第 3 行中,指针将始终递增到下一个 block (4 个字节,因为它是一个 int)...所以如果在字符串末尾后的下一个内存块中恰好有数据,这段代码不会失败吗?
更新:所以 c 中没有 bool 类型对吗?如果值为 0,条件语句的计算结果为“假”,否则为“真”?
最佳答案
第 2 行检查当前字符是否为字符串的空终止符 - 由于 C 字符串以空字符终止,并且空字符被视为假值,因此它将在到达末尾时开始展开递归字符串(而不是尝试在空终止符之后的字符上调用 StrReverse4,这将超出有效数据的范围)。
另请注意,指针指向 char
,因此递增指针只会递增 1 个字节(因为 char
是单字节类型)。
例子:
0 1 2 3
+--+--+--+--+
|f |o |o |\0|
+--+--+--+--+
- 当
str
=0
时,*str
为'f'
因此递归调用为str+1 = 1。 - 当
str
=1
时,*str
为'o'
因此递归调用为str+1 = 2。 - 当
str
=2
时,*str
为'o'
因此递归调用为力+1 = 3。 - 当
str
=3
时,*str
为'\0'
和\0
是一个 false 值,因此if(*str)
的计算结果为 false,因此不会进行递归调用,因此返回我们得到的递归... - 最近的递归之后是 `putchar('o'),然后是,
- 下一个最近的递归之后是 `putchar('o'),然后是,
- 最近最少的递归之后是 `putchar('f'),我们就完成了。
关于c - 这段 C 代码是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1361662/