代码之家  ›  专栏  ›  技术社区  ›  James

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

  •  11
  • James  · 技术社区  · 17 年前

    void ReversePrint(char *str) { //line 1
      if(*str) {                   //line 2
          ReversePrint(str+1);     //line 3
          putchar(*str);           //line 4
      }
    }
    

    *str

    10 回复  |  直到 17 年前
        1
  •  38
  •   Amber    17 年前

    char 是单字节类型)。

    例子:

     0  1  2  3
    +--+--+--+--+
    |f |o |o |\0|
    +--+--+--+--+
    
    1. 当 str 0 那么 *str 是 'f'
    2. 当 怎么翻译 = 1 那么 *str 是 'o'
    3. 当 怎么翻译 = 2 那么 *str 是 “o”
    4. 当 怎么翻译 = 3 那么 *str 是 '\0' 和 \0 if(*str)
    5. 下一个最近的递归后面是`putchar('o'),然后在那之后,
    6. 最近的递归后面跟着`putchar('f'),我们就完成了。
        2
  •  3
  •   DevSolar    17 年前

    以零字节结尾 .

    *str 因此,它是字符串的第一个字符 str .

    *str 在条件求值中 false 如果 怎么翻译

        3
  •  2
  •   1800 INFORMATION    17 年前

    if (*str) 正在检查该字节的存在,并在到达该字节时停止。

        4
  •  1
  •   Akash Kava    17 年前

    在第3行中,指针将始终递增到下一个块(4个字节,因为它是一个int)。..

    这是错误的,这是char*,它只会递增1。因为char只有1个字节长。

    但是,这是如何用作条件语句的参数的(除了布尔右之外应该是什么?)?

    在其他高级强类型语言中,你不能在if中使用这些东西,但在C中,一切都归结为数字。你可以使用任何东西。

    if(1) // evaluates to true 
    if("string")  // evaluates to true
    if(0) // evaulates to false
    

        5
  •  1
  •   Jason Plank Maksim Kondratyuk    14 年前

    在字符串的末尾有一个 0 -所以你有 "test" => [0]'t' [1]'e' [2]'s' [3]'t' [4]0

    和 if(0) -> false

        6
  •  0
  •   Christoph    17 年前

    0 手段 false 非零 true .

    错误的 ,而其他所有字符(非零值!)将为

    for(;*str; ++str) { /* so something with *str */ }
    

    StrReverse4() 做同样的事情,但通过递归而不是迭代。

        7
  •  0
  •   ezpz    17 年前

    if , for , while 等)期望一个布尔表达式。如果你提供一个整数值,那么计算结果可以归结为 0 == false 或 non-0 == true 如前所述,c字符串的终止字符是空字节(整数值0)。所以 如果 将在字符串末尾(或字符串中的第一个空字节)失败。

    顺便说一句,如果你这样做 *str 在NULL指针上,您正在调用未定义的行为;在取消引用之前,您应该始终验证指针是否有效。

        8
  •  0
  •   Gaston    16 年前

    这有点离题,但当我看到这个问题时,我立刻想知道这是否真的比只做一个strlen并从后面迭代更快。

    #include <string.h>
    
    void reverse1(const char* str)
    {
        int total = 0;
        if (*str) {
                reverse1(str+1);
                total += *str;
        }
    }
    
    void reverse2(const char* str)
    {
        int total = 0;
        size_t t = strlen(str);
        while (t > 0) {
                total += str[--t];
        }
    }
    
    int main()
    {
        const char* str = "here I put a very long string ...";
    
        int i=99999;
    
        while (--i > 0) reverseX(str);
    }
    

    我认为这是因为strlen是在汇编程序中实现的,递归增加了相当大的开销。

    我很确定这个基准是有代表性的,如果我错了,请纠正我。

    不管怎样,我想我应该和你分享这个。

        9
  •  0
  •   sth    16 年前

    str 怎么翻译 将使指针指向字符串的第二个字符(因为它是一个char数组)。 注意:递增指针将按指针指向的数据类型递增。

    例如:

    int *p_int;
    p_int++;     /* Increments by 4 */
    
    double *p_dbl;
    p_dbl++;      /* Increments by 8 */
    

    if(expression)
    {
       statements;
    }
    

    计算表达式,如果结果值为零( NULL , \0 , 0 ),语句不会被执行。因为每个字符串都以 \0 递归需要一段时间才能结束。

        10
  •  0
  •   Jason Plank Maksim Kondratyuk    14 年前

    int rev(int lower,int upper,char*string)
    {
      if(lower>upper)
              return 0;
       else
              return rev(lower-1,upper-1,string);
    }