`++` 和 `+=` 运算符的行为不同
`++` and `+=` operator are behaving differently
我有一个代码可以递归地打印指向 const char
的指针,或者我的意思是 string
。
当我使用 +=
运算符调用 print()
函数时,我的代码工作正常。但是,当我使用 ++
运算符时,我的代码进入无限循环,只打印 'H'
.
这是我的代码:TRY IT
#include <stdio.h>
void print(const char *s){
if(*s == 0)
return;
putc(*s, stdout);
print(s += 1); // infinite loop when `s++`
}
int main(void){
print("Hello");
return 0;
}
我知道在任何循环中举个例子:
for(size_t i = 0; i < 10; i++) { }
完全等同于
for(size_t i = 0; i < 10; i += 1) { }
那么,请告诉我我遗漏了什么?
您正在使用(后缀)post-increment 运算符 ++
,其值是递增前操作数的值。因此,您正在调用具有相同指针值的函数。您需要使用 pre-increment 运算符 ++
void print(const char *s){
if(*s == 0)
return;
putc(*s, stdout);
print( ++s );
}
来自 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).
至于for循环
for(size_t i = 0; i < 10; i++) { }
则不使用表达式i++
的值。变量 i
在应用运算符递增它的副作用之后使用。要检查这一点,您可以按以下方式编写 for 循环
for(size_t i = 0; i < 10; printf( "%zu ", i++ ) ) { }
s++
是一个 post-increment。它returns是s
的原始值,不是增加后的值。这意味着
print(s++);
等同于
print(s);
s++;
由于 print(s)
调用 print(s)
,你得到一个无限循环。
要在递增后获取 s
的值,请使用 pre-increment.
print(++s);
这相当于
++s;
print(s);
最后,没有理由改变s
。你应该简单地使用
print(s+1);
我有一个代码可以递归地打印指向 const char
的指针,或者我的意思是 string
。
当我使用 +=
运算符调用 print()
函数时,我的代码工作正常。但是,当我使用 ++
运算符时,我的代码进入无限循环,只打印 'H'
.
这是我的代码:TRY IT
#include <stdio.h>
void print(const char *s){
if(*s == 0)
return;
putc(*s, stdout);
print(s += 1); // infinite loop when `s++`
}
int main(void){
print("Hello");
return 0;
}
我知道在任何循环中举个例子:
for(size_t i = 0; i < 10; i++) { }
完全等同于
for(size_t i = 0; i < 10; i += 1) { }
那么,请告诉我我遗漏了什么?
您正在使用(后缀)post-increment 运算符 ++
,其值是递增前操作数的值。因此,您正在调用具有相同指针值的函数。您需要使用 pre-increment 运算符 ++
void print(const char *s){
if(*s == 0)
return;
putc(*s, stdout);
print( ++s );
}
来自 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).
至于for循环
for(size_t i = 0; i < 10; i++) { }
则不使用表达式i++
的值。变量 i
在应用运算符递增它的副作用之后使用。要检查这一点,您可以按以下方式编写 for 循环
for(size_t i = 0; i < 10; printf( "%zu ", i++ ) ) { }
s++
是一个 post-increment。它returns是s
的原始值,不是增加后的值。这意味着
print(s++);
等同于
print(s);
s++;
由于 print(s)
调用 print(s)
,你得到一个无限循环。
要在递增后获取 s
的值,请使用 pre-increment.
print(++s);
这相当于
++s;
print(s);
最后,没有理由改变s
。你应该简单地使用
print(s+1);