为什么以下两个代码段不相同?
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;
}
答案 0 :(得分:7)
++
运算符递增指针值,但随后返回原始值...因此print(s++)
将在递增之前打印s
的值,因为即使它添加了值为1到s
,使得s
存储的值等于s+1
,它仍然返回原始值s
作为< em>结果的操作。另一方面,print(s+1)
在增量后打印值,但非常重要的是不会修改s
的原始值。因此,语句s+1
的结果只是一个新的临时指针值... s
的原始值未被修改。
此外,由于您使用s
运算符增加并更改++
的值,因此当您调用cout
时,您现在将值打印到新指针的任何位置指向(如果你不小心,并且新的内存位置s
指向的话没有用户可访问的内存),这可能会导致崩溃或分段错误。使用s+1
时,s
的值仍未修改,因此cout
的结果将位于s
最初指向的位置。
正如迈克尔所指出的,这实际上是一个递归函数,所以第二个例子只是用相同的参数调用print()
,因为如前所述,s++
的返回值是原始值s
。这意味着你最终会在某个时刻出现堆栈溢出,只是崩溃,除非s
指向的值已经是NULL字符。
答案 1 :(得分:1)
s++
和s+1
两个表达式都与增加指针本身的位置有关,而不是指针位置包含的值
s++
的价值仅为s
,s+1
的值是s
的一个位置!
s
后s++
的值比以前更进一步。使用s+1
后,s
的值不变。因此,他们打印字母的顺序是相反的!
答案 2 :(得分:1)
由于看起来OP将print(s++)
更改为print(++s)
,这是非常不同的,这里是对这个新版本的解释。
在第一个例子中,你有:
print(s+1);
cout << *s;
s + 1不会修改s。因此,如果s是4,而你print(s+1)
,则之后s仍然是4。
print(++s);
cout << *s;
在这种情况下,++ s修改s的本地值。它将它递增1.因此,如果它在print(++s)
之前为4,则之后 5 。
在这两种情况下,相当于s + 1的值都会传递给print函数,导致它打印下一个字符。
因此,两个函数之间的区别在于第一个函数将递归打印字符#0,然后是1,2,3,...,而第二个函数打印1,2,3,4 ......(...它会跳过第一个字符并在之后打印“\ 0”。
例:
对于s+1
版本,print("hello")
将导致h
e
l
l
o
对于++s
版本,print("hello")
将导致e
l
l
o
\0
答案 3 :(得分:0)
我将尝试解释前后增量的示例,您可以从中解决自己发布的问题。
#include <iostream>
void foo(int num)
{
std::cout << num << "\n" ;
}
int main()
{
int number = 10 ;
foo( number++ ) ;
foo( ++number ) ;
foo( number + 1 ) ;
getchar() ;
return 0 ;
}
<强>输出:强>
10
12个
13
为什么10?
foo( number++ ) ;
后增量操作在数字上完成。含义,数字的值首先传递给foo
,然后数字的值在foo
返回时递增。因此,在函数返回后,数字为11。
为什么12?
foo( ++number ) ;
预增量操作在数字上完成。这意味着,在调用foo
之前,number
的值会增加到12.然后传递给foo
。因此,即使在函数返回后,数字仍为12。
为什么选择13?
这是直截了当的。 数字的值未修改,但传递的值为数字的值加1。在此过程中,不会修改数字。因此,即使在函数返回后,数字仍然是12。
希望这有助于自己解决问题(尽管在你的情况下是纸笔练习):)