为什么以下两个代码段不相等?
void print (char* s) {
if (*s == '\0')
return;
print(s+1);
cout << *s;
}
void print (char* s) {
if (*s == '\0')
return;
print(++s);
cout << *s;
}
Run Code Online (Sandbox Code Playgroud)
该++运营商递增指针值,但随后返回原来的价值...所以print(s++)会打印的价值s增量之前,因为即使它增加了1的值s,使得存储在价值s相等s+1,但仍返回原来的s作为操作结果的值.另一方面,print(s+1)在增量后打印值,但非常重要的是不修改原始值s.因此语句的结果s+1只是一个新的临时指针值...原始值s未被修改.
此外,由于你已经增加和改变的价值s与++运营商,当你打电话cout,你现在的打印值到哪里新的指针指向(这可能导致崩溃或分段错,如果你不小心和新内存位置没有用户可访问的内存s指向).随着s+1,s遗骸的价值未经修改,因此结果cout将s是最初指向的地方.
正如迈克尔所指出的,这实际上是一个递归函数,所以第二个例子只是print()用相同的参数继续调用,因为如前所述,返回的值s++是原始值s.这意味着你最终会在某个时刻出现堆栈溢出,只是崩溃,除非s指向的值已经是NULL字符.