c - 这段 C 代码是如何工作的?

标签 c pointers recursion

我正在查看我遇到的以下代码,用于在 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|
+--+--+--+--+
  1. str = 0 时,*str'f' 因此递归调用为str+1 = 1。
  2. str = 1 时,*str'o' 因此递归调用为str+1 = 2。
  3. str = 2 时,*str'o' 因此递归调用为力+1 = 3。
  4. str = 3时,*str'\0'\0 是一个 false 值,因此 if(*str) 的计算结果为 false,因此不会进行递归调用,因此返回我们得到的递归...
  5. 最近的递归之后是 `putchar('o'),然后是,
  6. 下一个最近的递归之后是 `putchar('o'),然后是,
  7. 最近最少的递归之后是 `putchar('f'),我们就完成了。

关于c - 这段 C 代码是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1361662/

相关文章:

c - 在c套接字编程中使用write发送缓冲区

c++ - 如何将派生类作为函数参数传递 : what if the derived class members are not in the parent class

c++ - 如何在 V8 中存储持久句柄?

c - 以下代码在C语言中的输出是什么?

java - 返回 int 的递归方法无法编译

javascript 用递归爬升步骤

c++ - 如何在 C/C++ 中使用 "use the write() system call to read from the page (writing to a dummy pipe() file descriptor)"?

c - GTK+ 3.0 警告 : missing initializer for field ‘padding’ of ‘GActionEntry’

c - 内置函数 'printf"的不兼容隐式声明

javascript - 如何向(对象的)嵌套 javascript 数组添加属性?