为什么 ++str 和 str+1 能够工作而 str++ 不能?

6
我知道有一些关于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);却不行。为什么?


2
除了增量的问题之外,在替换完成后,没有必要再对str进行增量操作,因为str已经不再使用。通常的写法应该是replace(str + 1, c1, c2) - dxiv
4个回答

7

replace(str++, c1, c2); means:

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

当使用replace(++str, c1, c2);时,它的含义为:

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

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

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


2

前缀运算符++和后缀运算符++都会增加参数的值,它们之间的区别在于表达式的结果。

前缀++的计算结果是参数增加后的值,而后缀++的计算结果是参数增加前的值。

例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接