为什么 ++str 和 str+1 有效而 str++ 无效?
Why ++str and str+1 is working and str++ isn't?
我知道这里有一些关于 p++、++p 和 p+1 之间区别的解释,但我还不能清楚地理解它,尤其是当它不使用该函数时:
void replace(char * str, char c1, char c2){
if (*str == '[=10=]') {
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.
值的函数
来自 C 标准(6.5.2.4 后缀递增和递减运算符)
2 The result of the postfix ++ operator is the value of the
operand. As a side effect, the value of the operand object is
incremented (that is, the value 1 of the appropriate type is added to
it)
你可以考虑这个函数调用
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
replace(str++, c1, c2);
表示:
replace(str, c1, c2);
str+=1;
而 replace(++str, c1, c2);
表示:
str+=1;
replace(str, c1, c2);
前缀 ++
运算符和后缀 ++
运算符都会递增参数。区别在于表达式的结果。
前缀 ++
在 递增后求值为参数 的值,而后缀 ++
求值为参数 [=21] 的值=]之前递增。
例如:
int i = 1;
printf("i=%d\n", ++i); // i == 2, prints 2
printf("i=%d\n", i++); // i == 3, prints 2
++str
和 str+1
使指针指向下一个字节,而 str++
将指针的当前位置作为参数传递。
我知道这里有一些关于 p++、++p 和 p+1 之间区别的解释,但我还不能清楚地理解它,尤其是当它不使用该函数时:
void replace(char * str, char c1, char c2){
if (*str == '[=10=]') {
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.
来自 C 标准(6.5.2.4 后缀递增和递减运算符)
2 The result of the postfix ++ operator is the value of the operand. As a side effect, the value of the operand object is incremented (that is, the value 1 of the appropriate type is added to it)
你可以考虑这个函数调用
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
replace(str++, c1, c2);
表示:
replace(str, c1, c2);
str+=1;
而 replace(++str, c1, c2);
表示:
str+=1;
replace(str, c1, c2);
前缀 ++
运算符和后缀 ++
运算符都会递增参数。区别在于表达式的结果。
前缀 ++
在 递增后求值为参数 的值,而后缀 ++
求值为参数 [=21] 的值=]之前递增。
例如:
int i = 1;
printf("i=%d\n", ++i); // i == 2, prints 2
printf("i=%d\n", i++); // i == 3, prints 2
++str
和 str+1
使指针指向下一个字节,而 str++
将指针的当前位置作为参数传递。