c - 用户定义的连接函数

标签 c

我正在学习 C,我遇到了下面实现串联的代码,但尽管重述了指针/增量优先级和关联性,但我仍在努力理解第二部分。

我已经运行了取消引用和后/前递增的所有不同组合的示例,现在回想一下,取消引用的预递增是从右到左关联的,例如 *++q 将出现 inc第一的。我从中了解到的页面指出,使用取消引用运算符的后增量具有更高优先级的增量,并继续说这个例子的关联性是从左到右的。我不是特别知道为什么它提到关联性,因为我知道优先级在它之前被认为是例如 *p++ 会在取消引用之前递增。

下面的代码首先使用 dest 上的 pre-inc 递归调用自身以到达目标字符串的末尾,这表示它到达并取消引用空字节。在这一点上,我迷失了方向,因为我原以为它只是将取消引用的目标指向取消引用的 src,但是它会根据我所学到的内容递增它,这会在空字节取消引用它之后递增到内存位置并继续将字符串“eeksfor”分配给 dest 中空字节上方的位置。这不仅让我感到困惑,而且程序继续在另一个三元运算符中调用自身/似乎无缘无故地返回 0。

谢谢

/* my_strcat(dest, src) copies data of src to dest.  To do so, it first           reaches end of the string dest using recursive calls my_strcat(++dest, src).         Once end of dest is reached, data is copied using  
(*dest++ = *src++)?  my_strcat(dest, src). */
void my_strcat(char *dest, char *src) 
{ 
  (*dest)? my_strcat(++dest, src): (*dest++ = *src++)? my_strcat(dest,   src): 0 ; 
} 

/* driver function to test above function */
int main() 
{ 
  char dest[100] = "geeksfor"; 
  char *src = "geeks"; 
  my_strcat(dest, src); 
  printf(" %s ", dest); 
  getchar(); 
}     

我运行了程序,它做了预期的事情。那就是它返回字符串“geeksforgeeks”,所以很明显我只是不理解某些东西

最佳答案

好的,所以你很好地理解了第一个递归位(继续递增 dst 以找到结尾)。

一旦找到结尾,就可以开始复制了。它用来复制一个字节的代码是:(*dest++ = *src++)

将该代码扩展为类似以下内容可能有助于您的理解:*dest = *src;目的地+=1;来源 += 1 (因为他们是后自增运算符)

现在,一个普通的“复制”函数会在 whilefor 循环中重复该语句,但是因为我们巧妙地炫耀,我们使用了第二个三元运算符和递归。最后的“0”实际上并没有做任何事情,但它需要作为三元运算符的“else”部分存在。

虽然这可能不是有史以来最糟糕的 strcat 实现,但它无疑是一个强有力的竞争者。

关于c - 用户定义的连接函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54739051/

相关文章:

c - ld 无法在 Raspbian 下找到 librrd

c++ - 如何使用 ffmpeg 提取 Xing/LAME 帧?

c++ - 获取光标位置和权限

c - scanf 输入验证也 1 scanf 获取 2 个输入并将其发送到下一个 var 而无需

c - 结构中硬件保留寄存器的占位符

c++ - 获取内存泄漏导致的内存溢出,应用程序继续运行和分配

c - 如何从 C 程序创建共享库?

c++ - 编译一个静态二进制文件,其中代码有一个函数 gethostbyname

c - 了解 C 中的地址

c - 在 TCL 中有两个变量的 For 循环