void reverse(char *s,int j,int i) {
printf("%d\t%d\n",i,j);
if(i<j) {
swap(s, i, j);
reverse(s,--j,++i);
}
}
我在 Stack Overflow 上读到,在函数调用中使用后增量运算符会带来问题,但是在函数调用中使用前增量也是错误的吗?
请帮忙。
void reverse(char *s,int j,int i) {
printf("%d\t%d\n",i,j);
if(i<j) {
swap(s, i, j);
reverse(s,--j,++i);
}
}
我在 Stack Overflow 上读到,在函数调用中使用后增量运算符会带来问题,但是在函数调用中使用前增量也是错误的吗?
请帮忙。
如果增量运算符修改同一序列点(语句)中的同一变量,则会导致未定义的行为。例如,如果您调用这样的函数:foo(++i, ++i)
C 标准没有说明应该以什么顺序执行增量,并且您无法预测将传递给函数的内容。
这不是这里的情况,所以你的程序的语义是明确定义的。也就是说,i 和 j 递增,然后将它们的值传递给函数。
我看到您编写的函数的唯一问题是您使用了条件 i!=j,这可能会导致偶数长度的字符串出现问题。
考虑字符串长度 = 4 的情况,您将函数调用为 reverse(s,3,0)-> reverse(s,2,1)->reverse(s,1,2).. 所以您可以看到 'i' 永远不会等于 'j' 并且循环不会终止,而是当 j 变为负数并且 i 变得大于字符串的长度时,您可能会在访问部分内存时出现运行时错误不允许。希望这是有道理的。:)