黑马程序员技术交流社区

标题: 关于return的问题! [打印本页]

作者: 李广水    时间: 2013-4-18 20:52
标题: 关于return的问题!
本帖最后由 李广水 于 2013-4-19 22:52 编辑
  1. public static int duqu()
  2.         {
  3.             int i = 0;
  4.             bool flag = true;
  5.             Console.WriteLine("请输入一个整数:");
  6.             while (flag)
  7.             {
  8.                 string s0 = Console.ReadLine();
  9.                
  10.                 try
  11.                 {
  12.                    i= shuchu(s0);  //shuchu是一个把字符串转换成整数的方法!
  13.                     Console.WriteLine("您输入的是个整数。");
  14.                     flag = false;
  15.                     Console.WriteLine("{0}",i);
  16.                 }
  17.                 catch
  18.                 {
  19.                     Console.Write("您所输入的不是整数,请重新输入:");

  20.                 }
  21.                 return i;//为什么不能在这返回i的值,是和return执行后程序或者说是方法必须关闭的有关系么?
  22.             }
  23.             //return i;//为什么在这里返回i就是正确的,不会出错!
  24.        }
复制代码
请帮忙讲解一下return的用法,有点迷惑!谢谢了
作者: 黑马-雷钊    时间: 2013-4-18 21:03
同学,你好。
reture可以在Get()方法中用于返回数据

也可以在循环语句中用来中断循环。

而你把return写在了
while (flag)
{
。。。。。;
return
}
这个循环中,所以这时的return就是用于中断这个循环。
而不是用于返回数据。
希望能帮到你。
作者: 李广水    时间: 2013-4-18 21:10
黑马-雷钊 发表于 2013-4-18 21:03
同学,你好。
reture可以在Get()方法中用于返回数据
  1. public static int ReadInt()
  2.         {
  3.             int number = 0;
  4.             do
  5.             {
  6.                 try
  7.                 {
  8.                     number = Convert.ToInt32(Console.ReadLine());
  9.                      return number;
  10.                 }
  11.                 catch
  12.                 {
  13.                     Console.WriteLine("输入有误,请重新输入!");
  14.                 }
  15.             }while(true);
  16.         }
复制代码
在这个循环中,为甚么return number(相当于return i)就可以跳出循环,并且返回值
!我的疑问是return ;有几种使用情况,都是什么情况下使用。具体的怎么理解return的作用和
用法!
作者: 李广水    时间: 2013-4-18 21:12
黑马-雷钊 发表于 2013-4-18 21:03
同学,你好。
reture可以在Get()方法中用于返回数据

同学能例举一下例子么?最经虽然可以知道怎么用,也可以把错改了,但是不是很理解!!
作者: 许庭洲    时间: 2013-4-18 21:12
1. 如果你的try{}catch后面还有语句的话,你在这里写个return i;
2.那么编译是无法通过的,因为编译器会认为你catch以后的代码块无法到达,所以没有返回i的值。
作者: 黑马-雷钊    时间: 2013-4-18 21:21
同学,你好。
这个return既能跳出循环又能返回值就有点违背常理了。
因为在我目前所学的知识里return就只有两个作用。
一个是中段循环。
使用情况和break差不多。都可以终止循环。
一个是返回值。
这个就是在函数中设有返回值的时候用。
至于这个问题我想可以暂时先看看有没有其它人回答。
值得肯定的一点是:不是return的一种特殊功能就是do…while的一种特殊功能。
作者: 李广水    时间: 2013-4-18 21:24
许庭洲 发表于 2013-4-18 21:12
1. 如果你的try{}catch后面还有语句的话,你在这里写个return i;
2.那么编译是无法通过的,因为编译器会认 ...

你的意思是说
while
{
try
{   }
catch
{    }
return i;//您的是是在这里写return i;的话,已经不能执行了么?
}

那么和上面同学说的中断循环没有关系吧、???
作者: 黑马-雷钊    时间: 2013-4-18 21:33
嘿嘿   同学   你也别急    既然这个情况出了肯定会被人解决的    再耐心等等吧   
作者: 李广水    时间: 2013-4-18 21:34
黑马-雷钊 发表于 2013-4-18 21:21
同学,你好。
这个return既能跳出循环又能返回值就有点违背常理了。
因为在我目前所学的知识里return就只有 ...

谢谢。。。还在求知中。。。。
作者: ↖落葉下♀媃媚    时间: 2013-4-18 22:26
我觉得应该是与try-catah有关,这是检测异常的,

try

11.                {

12.                   i= shuchu(s0);  //shuchu是一个把字符串转换成整数的方法!

13.                    Console.WriteLine("您输入的是个整数。");
                            return i;//放在这试试
14.                    flag = false;//这如果正确就不往下进行了,直接结束循环了

15.                    Console.WriteLine("{0}",i);

16.                }

17.                catch//出现异常时输出的语句

18.                {

19.                    Console.Write("您所输入的不是整数,请重新输入:");

20.

21.                }
另外你把错误输出给我们看一下
作者: 黑马-雷钊    时间: 2013-4-18 22:57
↖落葉下♀媃媚 发表于 2013-4-18 22:26
我觉得应该是与try-catah有关,这是检测异常的,

try

你好,同学。我看不见得吧。因为我也在学哈。所以我把我的想法说出来给大家分享。
同学你别以为我反驳你的答案哈。
我感觉异常不就是关于安全问题才需要抛么。
而return貌似没有涉及到安全问题吧?那么异常在这里面就起不到什么作用了。
其实我们可以试试不写异常,直接把do…while和return写出来。
这样的话我们就知道是不是与异常有关系了。
嘿嘿。
(不过时间不早要休息了 ,我明天再写代码吧。)
作者: 黑马-雷钊    时间: 2013-4-18 23:04
↖落葉下♀媃媚 发表于 2013-4-18 22:26
我觉得应该是与try-catah有关,这是检测异常的,

try

同学,你好。
刚才还是把代码写出来了。我把图片给你。

QQ截图20130418230218.png (78.01 KB, 下载次数: 8)

QQ截图20130418230218.png

作者: 陈帅    时间: 2013-4-18 23:11
应该是这样的:首先你要知道,编译生成、跟运行不是一样的,我们必须编译通过,才可以运行,那么你的程序中定义了一个 flag = true;然后把放到了while循环中
while(flag)
{
你的代码
}
当你代码写完,编译生成的时候,编译器并不知道你while里的flag到底是什么,编译器会认为有两个情况,如果是true就能进入while循环,你的return写在while里是完全没问题的,如果是false,while循环根本就进不去,所以你把return放在while里根本不可能返回的到;
所以你可以把while里直接放true,就可以在里面用return了,即
while(true)
{
代码
}
作者: 陈帅    时间: 2013-4-18 23:17
而且如果楼主听的话 再给你提个意见:
个人认为你这个方法有问题,你的本意应该是该方法检测用户输入的是否是int类型,但是方法一定要单一,里面尽量少出现Console.WriteLine()等;而且,一个方法的方法名不是你那么命名的,每个首字符都应该大写。我觉得你应该单单只写一个方法去判断是否是int类型,然后在main函数中调用,而不是把用户输入什么的一起放到方法里。我觉得你如下写可能更好:
  1.    static void Main(string[] args)
  2.         {
  3.             Console.WriteLine("请您输入一个整数,我们来判断是否是整数,是的话就输出该数,不是默认输出0!");
  4.             string input = Console.ReadLine();
  5.             int num = Test(input);
  6.             Console.WriteLine("您输入的是{0}", num);
  7.             Console.ReadKey();
  8.         }
  9.         /// <summary>
  10.         /// 是整数就返回本身,不是就返回0
  11.         /// </summary>
  12.         /// <param name="input"></param>
  13.         /// <returns></returns>
  14.         public static int Test(string input)
  15.         {
  16.             int num = 0;
  17.             try
  18.             {
  19.                 num = Convert.ToInt32(input);
  20.             }
  21.             catch
  22.             {

  23.             }
  24.             return num;
  25.         }
复制代码

作者: 李广水    时间: 2013-4-19 22:50
非常感谢。。。明白了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2