为啥 ++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
的意义,因为str
在replace
之后不再使用。写它的自然方式就是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】:++str
和str+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”对象没有属性“光标”而失败?
为啥Python会写str' object has no attribute 'andswith?