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

时间:2020-05-10 00:10:03

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

我知道这是一些有关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);却不起作用。为什么?

4 个答案:

答案 0 :(得分:7)

replace(str++, c1, c2);的意思是:

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

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

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

答案 1 :(得分:4)

表达式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 :(得分:2)

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

前缀++的计算结果为自变量之后的值,而后缀++的计算结果为自变量之前的值递增。

例如:

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

答案 3 :(得分:2)

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