`++` 和 `+=` 运算符的行为不同
我有一个代码可以递归地打印指向 const char
的指针,或者我的意思是一个 string
。 当我使用 += 运算符调用 print() 函数时,我的代码工作正常。但是,当我使用 ++
运算符时,我的代码会进入无限循环,仅打印 'H'
。
这是我的代码: 尝试一下
#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) { }
然后,请告诉我错过了什么?
I have a code which print pointer to const char
, or I mean a string
, recursively.
My code works fine when I'm using +=
operator to call print()
function. But, when I'm using ++
operator my code goes to an infinite loop just printing 'H'
.
Here's my code: 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;
}
I know that in any loop for an example:
for(size_t i = 0; i < 10; i++) { }
is completely equivalent to
for(size_t i = 0; i < 10; i += 1) { }
Then, please tell what I'm missing out?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您正在使用(后缀)后递增运算符
++
,其值是递增之前操作数的值。因此,您正在使用相同的指针值调用该函数。您需要使用C 标准中的预自增运算符
++
(6.5.2.4 后缀自增和自减运算符)对于 for 循环
,则不使用表达式 i++ 的值。变量
i
在应用了运算符递增的副作用后使用。要检查这一点,您可以按以下方式编写 for 循环You are using the (postfix) post-increment operator
++
the value of which is the value of the operand before incrementing. So you are calling the function with the same value of the pointer. You need to use the pre-increment operator++
From the C Standard (6.5.2.4 Postfix increment and decrement operators)
As for the for loop
then the value of the expression
i++
is not used. The variablei
is used after applying the side effect of incrementing it by the operator. To check this you could write the for loop the following ways++
是后置增量。它返回s
的原始值,而不是增加的值。这意味着这相当于
由于
print(s)
调用print(s)
,您会得到一个无限循环。要在递增后获取
s
的值,请使用预递增。这相当于
最后,没有理由更改
s
。你应该简单地使用s++
is a post-increment. It returns the original value ofs
, not the incremented value. This means thatis equivalent to
Since
print(s)
callsprint(s)
, you get an infinite loop.To get the value of
s
after it's been incremented, use a pre-increment.This is equivalent to
Finally, there's no reason to change
s
. You should simply use