扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这是一个递归的处理
饶阳网站建设公司创新互联,饶阳网站设计制作,有大型网站制作公司丰富经验。已为饶阳1000多家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的饶阳做网站的公司定做!
递归是使用栈实现的,下面仔细的分析一下压栈、退栈的情况
x=try(5);
调用try函数,进入try函数开始递归处理。
try(5)
当前n=5,if ( n0 )成立,进入if分支:
return ( n * try (n-2) );
也就是return ( 5 * try(3) );
当前栈中的情况:
5 --------栈底
try(3)
当前n=3,if ( n0 )成立,进入if分支:
return ( n * try (n-2) );
也就是return ( 3 * try(1) );
当前栈中的情况:
3
5 --------栈底
try(1)
当前n=1,if ( n0 )成立,进入if分支:
return ( n * try (n-2) );
也就是return ( 1 * try(-1) );
当前栈中的情况:
1
3
5 --------栈底
try(-1)
当前n=-1,if ( n0 )不成立,进入else分支:
else return(1);
返回1.
当前栈中的情况:
1 --------栈顶
1
3
5 --------栈底
所以整个递归处理后,栈的情况如下:
1 --------栈顶
1
3
5 --------栈底
在try(-1)时,到达递归的出口,开始从栈顶退栈,
所以退找后的表达式为:
1*1*3*5=15
所以最后x等于15,输出15
c#中通常使用try-catch语句来捕获和处理异常。下面我们看看try-catch语句的使用语法。
try
{
可执行语句块;
}
catch
(
exception
e
)
{
异常处理语句;
throw;
}
1、try语句块中放置可能存在异常的代码块。若执行try语句块时有异常发生,则程序抛出的异常,由catch语句捕获;若try语句块没产生异常,程序会直接跳出try-catch语句。
2、catch语句块紧跟在try语句块后面,它可以捕获try语句块中抛出的异常。注意catch关键字后有一对小括号,小括号中需放置异常类参数,参数名是可省略的。当try语句抛出异常时,抛出的异常类型会与catch语句中的异常类型进行匹配,若匹配成功,则执行catch语句块中的内容。
3、exception是所有异常类的父类,它能和所有异常类匹配。前一小节抛出的indexoutofrangeexception异常类也是exception的子类。需注意的是:如果catch语句块不带参数,那么catch语句也能捕获所有异常。
4、throw关键字表示抛出一个异常,可省略。
同时try-catch语句通常和finally语句一起使用,具体的使用方法可以参考秒秒学网站讲解异常的那一章,其实上面的内容我也是从那里学来的。
try
{
//必须执行的语句
}
catch()
{
//try里面出现异常则执行这里
}
这句话一般用做程序抛出异常.防止程序出现卡死的情况.我们一般用此语句主要用在对数据库的增删改的敌方.毕竟这是最容易出错的敌方.为了使程序提高性能,不崩溃的情况下.就是要使用这句语句.
C语言是没有try语句的,还有,你这个地方也就算是一个函数(在C语言里面你写的这个try只能是函数)
有语法错误,帮你改了,你自己再看看
#includestdio.h
void try(int,int,int);
int main()
{
int x=2,y=3,z=0; //y=3
printf("(1)x=%d y=%d z=%d\n",x,y,z);
try(x,y,z);
printf("(4)x=%d y=%d z=%d\n",x,y,z);
}
void try(int x,int y,int z)
{
printf("(2)x=%d y=%d z=%d\n",x,y,z);
z=x+y;
x=x*x;
y=y*y;
printf("(3)x=%d y=%d z=%d\n",x,y,z);
}
一点补充:最开始我运行你这个程序是在一个.cpp文件里面写的代码,然后运行,但是程序会报错,为什么呢?因为cpp一般而言是C++的文件,C++里面有try语句,try是他的一个关键字,所以函数名不能是关键字,程序报错了。
但是在一个.c文件里面是没有问题的~~
还有,你这个真心是一个函数,不是try语句,try语句是
try
{
do something
}
catch(some error)
{
do something
}
try里面的是一个程序块,你把可能发生异常的程序块放到try中执行,
如果真发生异常的话,try就把这个异常抛出,
这个抛出过程由throw进行,抛出异常后,
由紧跟在try块后的
catch
接收并解决这个异常
try 语句可为一组语句指定异常处理器和/或清理代码:
1.子句指定一个或多个异常处理程序。 当 try 子句中没有发生异常时,没有任何异常处理程序会被执行。 当 try 子句中发生异常时,将启动对异常处理程序的搜索。 此搜索会逐一检查 except 子句直至找到与该异常相匹配的子句。 如果存在无表达式的 except 子句,它必须是最后一个;它将匹配任何异常。 对于带有表达式的 except 子句,该表达式会被求值,如果结果对象与发生的异常“兼容”则该子句将匹配该异常。 如果一个对象是异常对象所属的类或基类,或者是包含兼容该异常的项的元组则两者就是兼容的。
2.如果没有 except 子句与异常相匹配,则会在周边代码和发起调用栈上继续搜索异常处理器。 1
3.如果在对 except 子句头中的表达式求值时引发了异常,则原来对处理器的搜索会被取消,并在周边代码和调用栈上启动对新异常的搜索(它会被视作是整个 try 语句所引发的异常)。
当找到一个匹配的 except 子句时,该异常将被赋值给该 except 子句在 as 关键字之后指定的目标,如果存在此关键字的话,并且该 except 子句体将被执行。 所有 except 子句都必须有可执行的子句体。 当到达子句体的末尾时,通常会转向整个 try 语句之后继续执行。 (这意味着如果对于同一异常存在有嵌套的两个处理器,而异常发生于内层处理器的 try 子句中,则外层处理器将不会处理该异常。)
4.当使用 as 将目标赋值为一个异常时,它将在 except 子句结束时被清除。 这就相当于
这意味着异常必须赋值给一个不同的名称才能在 except 子句之后引用它。 异常会被清除是因为在附加了回溯信息的情况下,它们会形成堆栈帧的循环引用,使得所有局部变量保持存活直到发生下一次垃圾回收。
5.函数的返回值是由最后被执行的 return 语句所决定的。 由于 finally 子句总是被执行,因此在 finally 子句中被执行的 return 语句总是最后被执行的:
6.当找到一个匹配的 except 子句时,该异常将被赋值给该 except 子句在 as 关键字之后指定的目标,如果存在此关键字的话,并且该 except 子句体将被执行。 所有 except 子句都必须有可执行的子句体。 当到达子句体的末尾时,通常会转向整个 try 语句之后继续执行。 (这意味着如果对于同一异常存在有嵌套的两个处理器,而异常发生于内层处理器的 try 子句中,则外层处理器将不会处理该异常。)
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流