为啥 ++str 和 str+1 有效而 str++ 无效?

Posted

技术标签:

【中文标题】为啥 ++str 和 str+1 有效而 str++ 无效?【英文标题】: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) 【参考方案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);

【讨论】:

以上是关于为啥 ++str 和 str+1 有效而 str++ 无效?的主要内容,如果未能解决你的问题,请参考以下文章

如果 t.__str__() 返回一个非字符串而不是 print(t.__str__()),为啥 print(t) 会出错?

为啥我的单元测试因错误“str”对象没有属性“光标”而失败?

为啥在返回字符串的函数上调用 c_str() 不起作用?

为啥Python会写str' object has no attribute 'andswith?

逻辑表达式:为啥“str1 in str2 or str2 not in str1”为我的打印语句返回 True?

Java - 为啥 str.substring(str.length()) 是可接受的代码行? [关闭]