这段C代码是做什么的?

问题描述:

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(); 
} 

[与函数体代码混淆]我了解ç主题指针和三元运算非常好,但混乱与上面的代码这是什么想在条件语句来检查和进一步什么是真假依赖陈述发生。这段C代码是做什么的?

任何人都可以详细解释它代码实际上在做什么?

+0

此函数依赖于在调用之前将dest完全归零 –

+0

现在,geeksforgeeks已经教会了如何编写错误的C代码,找到了教导相反的教程。 – Lundin

它假定目标缓冲区char dest[100]不仅以null结尾,而且全部填充为\0

因此,首先,*dest是检查是否该字符,其中dest点,是一个空终止子,即0

如果它没有找到它,那么它递归地调用它自己,但是向右一个位置,最终找到null终止符。 (如果没有空终止符,那么这个功能是很危险的,写了缓冲区。)

如果确实找到空终止符,然后将其复制一个从源字符到目的地,然后调用本身与两个指针向右移动,继续复制。 (同样,这似乎是没有界限的适当检查工作要做。)

三元运算符?仅仅是一个的if-else,所以身体就相当于:

if(*dest) 
    my_strcat(++dest, src); 
else 
    if(*dest++ = *src++) 
     my_strcat(dest, src); 
    else 
     0; 

所以它会递归函数,而假设dest是一个以NULL结尾的字符串,并且\0直到它结束,但这就是为什么它会测试*dest。此外,我想你现在知道这个功能。

函数将src给出的字符串复制到dest数组中给出的\0填充位置上。所以,假如你有

char dest[100] = "geeks for\0 foo \0\0\0 bar "; 
char *src = "geeks"; 

结果将是

geeks forg foo eek bar s 
     ^ ^^^ ^<-- geeks (src) 
^^^^^^^^^ ^^^^^ ^^^^^ <-- geeks for\0 foo \0 bar \0\0\0... (dest) 

这一行:

(*dest)? my_strcat(++dest, src): (*dest++ = *src++)? my_strcat(dest, src): 0 ; 

非常递归。

通过'dest'步骤直到找到'\ 0'字符,然后将字符从'src'复制到'dest',并且如果复制的字符不是'\ 0',则再次调用自身(和一次又一次),直到复制包括最终'\ 0'的所有字符。

但是,我会担心最后的零,因为这不是一个可执行语句。建议使用return代替

+0

无需担心最终的'0'。表达式是合法的陈述。 –