理解C中的打印值

时间:2017-06-25 17:30:43

标签: c pointers vector

我有这段代码

#include <stdio.h>
void Funz(char *S);
int main()
{
        char S[100] = "abcdefghilmnopq";
        Funz(S);
    return 0;
}
void Funz(char *S)
{
    if ('\0' != S[0])
    { 
    Funz(S+1);
    printf("%c", *S);
    }
}

我不确定为什么打印值的顺序相反,而不仅仅是&#34; q&#34;。

2 个答案:

答案 0 :(得分:2)

Funz(S+1);
printf("%c", *S);

这是递归调用,之后执行printf。为了打印每个子调用必须完成,然后执行printf。这就是它反向打印的原因。

相反,如果你使用循环和迭代,那么你将只获得'q'

例如,让我们来一个简短的字符串"abc" -

                           Funz(s[0]) (0
                         /          \
                    Funz(s[1])(1   'a' (6
                   /           \
               Funz(s[2])(2  'b'(5
              /            \
            condition    'c'(4
            false (3

执行顺序 - 0 1 2 3 4 5 6

答案 1 :(得分:2)

因为您在打印之前递归调用Funz(S)。会发生的是递归最终在q结束,因为它是空终止符之前的最后一个字母。

捕获并处理了null终止符异常后,它返回上一个函数框并打印该字符。

如果您希望按顺序打印,则需要打印字符然后递归它。

而不是像这样编码:

void Funz(char *S)
{
    if ('\0' != S[0])
    { 
    Funz(S+1);
    printf("%c", *S);
    }
}

您应将其编码为:

void Funz(char *S)
{
    if ('\0' != S[0])
    { 
        printf("%c", *S);
        Funz(S+1);
    }
}