为什么 ++str 和 str+1 有效而 str++ 无效?

Why ++str and str+1 is working and str++ isn't?

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

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

    if (*str == '[=10=]') {
        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++ 在增加其操作数之前产生值。因此,您正在调用具有相同 str.

值的函数

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

2 The result of the postfix ++ operator is the value of the operand. As a side effect, the value of the operand object is incremented (that is, the value 1 of the appropriate type is added to it)

你可以考虑这个函数调用

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

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

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

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

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

前缀 ++ 运算符和后缀 ++ 运算符都会递增参数。区别在于表达式的结果。

前缀 ++ 在 递增后求值为参数 的值,而后缀 ++ 求值为参数 [=21] 的值=]之前递增。

例如:

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

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