我正在学习 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 (因为他们是后自增运算符)
现在,一个普通的“复制”函数会在 while 或 for 循环中重复该语句,但是因为我们巧妙地炫耀,我们使用了第二个三元运算符和递归。最后的“0”实际上并没有做任何事情,但它需要作为三元运算符的“else”部分存在。
虽然这可能不是有史以来最糟糕的 strcat 实现,但它无疑是一个强有力的竞争者。
关于c - 用户定义的连接函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54739051/