黑马程序员技术交流社区

标题: return改为break后,就提示错误??? [打印本页]

作者: 肖云    时间: 2012-6-10 20:13
标题: return改为break后,就提示错误???
以下是我编的一个简单的四则运算程序,但是当我把case 3中if里面的return改为break后,就提示: 使用了未赋值的局部变量“result”
        private void btnResult_Click(object sender, EventArgs e)
        {
            string str1 = txtNumber1.Text;
            string str2 = txtNumber2.Text;
            int i1 = Convert.ToInt32(str1);
            int i2 = Convert.ToInt32(str2);
            int result;
            switch (cb运算符.SelectedIndex)
            {
                case 0:
                    result = i1 + i2;
                    break;
                case 1:
                    result = i1 - i2;
                    break;
                case 2:
                    result = i1 * i2;
                    break;
                case 3:
                    if (i2 == 0)
                    {
                        MessageBox.Show("0不能为除数!");
                        return;  //当我把这个return改为break,生成的时候,提示:最下面的result是未赋值的局部变量
                    }
                    result = i1 / i2;
                    break;
                default:
                    throw new Exception("未知的运算符");
            }
            txtResult.Text = Convert.ToString(result);
        }

截图1.jpg (13.98 KB, 下载次数: 77)

截图1.jpg

作者: 王继光    时间: 2012-6-10 20:36
是不是 因为你 把除数 输入为0了, 然后他跳出了 switch , 执行显示语句, 所以出现错误了??
  因为 之前 除数即使为0 , 你用得是return, 所以 此方法直接返回, 就不会出错, 用break后要执行下面的语句所以报错???  

我猜测的,, 觉得应该是这个原因!!
作者: G_Xiaotao    时间: 2012-6-10 21:26
呵呵  你把你的result赋值为0试试!! 同时楼主你的除数时 那个除数为0 是不是也要进行运算呢?
作者: 许庭洲    时间: 2012-6-11 08:30
你在定义result的时候赋个值试试看: int result=0;
作者: 赵学辉    时间: 2012-6-11 18:52
你改为break后,如果你的i2等于0,经过switch语句后就没有给result赋值,就直接到“txtResult.Text = Convert.ToString(result);  ”所以就报错!!!
作者: 朱亮辉    时间: 2012-6-11 18:55
   return; 之后的语句都不会再执行了,所以后面的代码并没有执行, 你可以给result变量一个初始值!
作者: 孙玉昌    时间: 2012-6-11 21:47
break语句与if联合使用的时候,意思是,当if满足条件,就跳出当前循环。你这个语句:

                    if (i2 == 0)
                    {
                        MessageBox.Show("0不能为除数!");
                        return;  //当我把这个return改为break,生成的时候,提示:最下面的result是未赋值的局部变量
                    }
                    result = i1 / i2;
                    break;
很明显的,当i2==0条件为真的时候,就不执行result=i1/i2;这句话了,也就是说result没有赋值。所以你要想这么使用,我觉得,你应该用
if{}else{}结构,因为break对if else结构不起作用,将result=i1/i2;break;放在else里试试。

作者: 肖云    时间: 2012-6-11 23:07
通过各位的解释,我已经明白问题所在了,多谢各位
作者: ren1015    时间: 2012-6-13 16:37
return 是结束过程,而break只是结束 switch 块,使用break 会执行switch块外的 txtResult.Text = Convert.ToString(result);语句就会出错
作者: 武剑峰    时间: 2012-6-14 14:51
本帖最后由 武剑峰 于 2012-6-14 14:52 编辑

  int result;定义时没有初始值,在使用return时,后边的程序压根就不可达,一般编译器就会提示,如果要执行的话到return处就不执行了,因为不可达,所以不会报错;但是使用break后,只是跳出了switch ,后边的程序 txtResult.Text = Convert.ToString(result);
肯定要执行,所以就会报错了。所以建议int result=0;
作者: 张寅平    时间: 2012-6-14 19:45
本帖最后由 张寅平 于 2012-6-14 20:02 编辑

break表示程序退出switch语句块,return只是退出if语句。应该在定义result变量时赋个初值。
作者: 李嫒    时间: 2012-6-19 12:35
你break后,直接跳出循环,result还是你定义的,没有被复制,肯定报错!
作者: 黑马李果    时间: 2012-7-3 21:31
本帖最后由 李过 于 2012-7-3 21:33 编辑

当 cb运算符.SelectedIndex==3, i2==0 都成立时,result未赋初值就break了,而后面就要用到result。虽然也许你可以保证 cb运算符.SelectedIndex==3, i2==0 不会同时成立,但是编译器不知道,具体走switch以及if中的那个分支,是运行时确定的,编译器为了以防万一,所以提示result未赋值。
你之前使用的return,以及最后一个case抛异常,这两个都在result未赋初值的情况下使程序在使用result之前停止运行,而其他case都是保证result赋了初值的,所以没错。
作者: 王玲星    时间: 2012-7-4 01:04
因为你没有result赋值啊,你只是定义了下,result是没有值的,你ruturn不就退出了这个方法,下面就不会执行了。
而break只是跳出了switch,向文本框 txtResult.Text 赋值的代码还是会执行的,但是result是没有值的,所以会报错。

作者: 戴伟    时间: 2012-7-4 07:00
break以后只是跳出循环,这时候下面的result=i1/i2得不到执行,所以result是没初始化的,所以Convert.ToString(result)这句肯定出错,不如初始化的时让result=0好了

作者: 秦永辉    时间: 2012-7-4 09:47
我认为是因为使用break的时候就跳出了本次循环,此时的result中没有值,但如果你用retrun的时候它把原来的值返回,再向下执行是跳出来时,result有值,所以会出现这个问题
作者: 古古头    时间: 2012-7-4 11:19
在switch语句中,编译器必须确认你的任何一条可能通向“ txtResult.Text = Convert.ToString(result);”的路径都能给result赋值,你使用return的时候就不存在这条路径,因为直接返回了,没有可能访问result,但是你使用break就有可能访问到result了,而你的if语句里面并没有给result赋值,result可能成为一个未赋值的变量,所以会报错
作者: 冯奎智    时间: 2012-7-4 15:18
return和break跳出的都是循环或者是switch,楼主的语句直接return后,
result = i1 / i2;
break;
是没有执行的,编译器当然会说result没有被赋初值喽
作者: 文硕    时间: 2012-7-6 18:29
break后还要执行txtResult.Text = Convert.ToString(result);显然此时你并没有对result赋值,所以此处改为break不对。
作者: 侯慧杰    时间: 2012-7-6 20:02
您可以在switch语句完成后再return,这样绝不会耗费系统资源,因为switch语句里虽然有多个case但始终只执行一个,当前一个case满足执行条件时后面的case不会再执行,直到return位置,不会耗费资源
作者: 常静华    时间: 2012-7-8 00:40
case 3:
                    if (i2 == 0)
                    {
                        MessageBox.Show("0不能为除数!");
                        return;  //break;
                    }
当i2=0的时候,break是结束掉While这循环,但是循环后面的 txtResult.Text = Convert.ToString(result);
是要运行的,但由于一开始你没有赋值,导致result为空!就会出现错误,但是有return则整个程序都停止,所以就不会运行 txtResult.Text = Convert.ToString(result);个了!
作者: 戴水平    时间: 2012-7-8 10:19
在定义 int result;改成result=0;
因为你把return 改成break时,程序还能往下执行。
txtResult.Text = Convert.ToString(result);转换的时候就没有值可以转换的。
所以报错了
作者: 魏振龙    时间: 2012-7-8 10:38
执行到txtResult.Text = Convert.ToString(result)的时候,result未赋值。一般来说定义一个变量时,要先赋一个初值,这样后面即使需要修改也不会出现因未赋值而引发的错误




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