【问题标题】:Why ++str and str+1 is working and str++ isn't?为什么 ++str 和 str+1 有效而 str++ 无效?
【发布时间】:2020-08-25 13:33:47
【问题描述】:

我知道这里有一些关于 p++、++p 和 p+1 之间区别的解释,但我还不能清楚地理解它,尤其是当它不使用该函数时:

void replace(char * str, char c1, char c2){

    if (*str == '\0') {
        return;
    }else if (*str == c1) {
        printf("%c", c2);
    }
    else {
        printf("%c", *str);
    }

    replace(++str, c1, c2);
}

当我执行replace(++str, c1, c2);replace(str+1, c1, c2); 时,它可以工作,但replace(str++, c1, c2); 不行。为什么?

【问题讨论】:

  • 除了哪个增量有效的问题之外,根本没有增加str 的意义,因为strreplace 之后不再使用。写它的自然方式就是replace(str + 1, c1, c2)

标签: c recursion c-strings post-increment function-declaration


【解决方案1】:

表达式str++ 在递增其操作数之前产生值。因此,您正在调用具有相同 str 值的函数。

来自 C 标准(6.5.2.4 后缀递增和递减运算符)

2 后缀++运算符的结果是 操作数。作为副作用,操作数对象的值是 递增(即,将适当类型的值 1 添加到 它)

你可以考虑这个函数调用

replace(str++, c1, c2);

喜欢

replace(str, c1, c2);
str += 1;

在另外两个电话中

replace(++str, c1, c2);

replace(str+1, c1, c2);

您正在传递字符串指针的递增值。

请注意,您的函数不会替换源字符串中的字符。它只是输出字符串替换输出中的字符。源字符串没有改变

在这种情况下,第一个函数参数应使用限定符 const 声明。

void replace(const char * str, char c1, char c2);

如果您想更改源字符串,则该函数可以如下面的演示程序所示。

#include <stdio.h>

char * replace( char *s, char c1, char c2 )
{
    if ( *s && *s == c1 ) *s = c2;

    if ( *s ) replace( s + 1, c1, c2 );

    return s;
}

int main(void) 
{
    char s[] = "Lucy is learning c";

    puts( replace( s, 'c', 'C' ) );

    return 0;
}

程序输出是

LuCy is learning C

【讨论】:

    【解决方案2】:

    ++strstr+1 使指针指向下一个字节,而str++ 将指针的当前位置作为参数传递。

    【讨论】:

      【解决方案3】:

      前缀++ 运算符和后缀++ 运算符都会增加参数。不同之处在于表达式的结果。

      前缀++ 计算为参数之后递增的值,而后缀++ 计算为参数之前递增的值。 p>

      例如:

      int i = 1;
      printf("i=%d\n", ++i);   // i == 2, prints 2
      printf("i=%d\n", i++);   // i == 3, prints 2
      

      【讨论】:

        【解决方案4】:

        replace(str++, c1, c2); 表示:

        replace(str, c1, c2);
        str+=1;
        

        replace(++str, c1, c2); 表示:

        str+=1;
        replace(str, c1, c2);
        

        【讨论】:

          相关资源