我知道这是一些有关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);
却不起作用。为什么?
答案 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)
++str
和str+1
使指针指向下一个字节,而str++
则将指针的当前位置作为参数传递。