我写了一段代码用递归来反转一个字符串。当我运行它的时候,我得到了一个分段错误。
#include <stdio.h>
void _print_rev_recursion(char *s);
int main() {
_print_rev_recursion("string reversal");
return (0);
}
void _print_rev_recursion(char *s)
{
if (!*s)
return;
_print_rev_recursion(s++);
putchar(*s);
}
当我把s改成s + 1的时候,代码是可以工作的。我想s和s+1的意思是一样的。我需要澄清。
下面是有效的代码:
#include <stdio.h>
void _print_rev_recursion(char *s);
int main() {
_print_rev_recursion("string reversal");
return (0);
}
void _print_rev_recursion(char *s)
{
if (!*s)
return;
_print_rev_recursion(s + 1);
putchar(*s);
}
3条答案
按热度按时间mm9b1k5b1#
ptr++
是后缀递增运算符,而ptr + 1
是将ptr的值加1的算术表达式。两者之间的主要区别是ptr ++在当前语句执行后将ptr的值加1,而ptr +1将ptr的当前值加1,但不更改ptr本身的值。
例如,考虑以下代码:
执行完这段代码后,i的值将为2,但j的值将为1,因为后缀递增运算符在将i的值赋给j后会递增i的值。
另一方面,考虑下面的代码:
在执行完该代码之后,i的值仍将是1,但j的值将是2,因为算术表达式i +1将1加到i的当前值,但不改变i本身的值。
5kgi1eie2#
我以为s ++和s +1的意思是一样的
他们没有。
s++
改变s
,而s+1
不改变。表达式的值也不同。
s++
在增量之前的值为s
。s+1
的值为s + 1
。k3bvogb13#
在
s++
的情况下,增量发生在函数被调用 * 之后 *,所以你得到无限递归。s+1
使增量发生在递归调用之前。