A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 肖云 中级黑马   /  2012-6-10 20:13  /  4631 人查看  /  22 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下是我编的一个简单的四则运算程序,但是当我把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, 下载次数: 84)

截图1.jpg

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

22 个回复

倒序浏览
是不是 因为你 把除数 输入为0了, 然后他跳出了 switch , 执行显示语句, 所以出现错误了??
  因为 之前 除数即使为0 , 你用得是return, 所以 此方法直接返回, 就不会出错, 用break后要执行下面的语句所以报错???  

我猜测的,, 觉得应该是这个原因!!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
呵呵  你把你的result赋值为0试试!! 同时楼主你的除数时 那个除数为0 是不是也要进行运算呢?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
你在定义result的时候赋个值试试看: int result=0;

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
你改为break后,如果你的i2等于0,经过switch语句后就没有给result赋值,就直接到“txtResult.Text = Convert.ToString(result);  ”所以就报错!!!

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
   return; 之后的语句都不会再执行了,所以后面的代码并没有执行, 你可以给result变量一个初始值!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
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里试试。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
肖云 中级黑马 2012-6-11 23:07:42
8#
通过各位的解释,我已经明白问题所在了,多谢各位
回复 使用道具 举报
return 是结束过程,而break只是结束 switch 块,使用break 会执行switch块外的 txtResult.Text = Convert.ToString(result);语句就会出错

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 武剑峰 于 2012-6-14 14:52 编辑

  int result;定义时没有初始值,在使用return时,后边的程序压根就不可达,一般编译器就会提示,如果要执行的话到return处就不执行了,因为不可达,所以不会报错;但是使用break后,只是跳出了switch ,后边的程序 txtResult.Text = Convert.ToString(result);
肯定要执行,所以就会报错了。所以建议int result=0;

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张寅平 于 2012-6-14 20:02 编辑

break表示程序退出switch语句块,return只是退出if语句。应该在定义result变量时赋个初值。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
你break后,直接跳出循环,result还是你定义的,没有被复制,肯定报错!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李过 于 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赋了初值的,所以没错。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
因为你没有result赋值啊,你只是定义了下,result是没有值的,你ruturn不就退出了这个方法,下面就不会执行了。
而break只是跳出了switch,向文本框 txtResult.Text 赋值的代码还是会执行的,但是result是没有值的,所以会报错。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
break以后只是跳出循环,这时候下面的result=i1/i2得不到执行,所以result是没初始化的,所以Convert.ToString(result)这句肯定出错,不如初始化的时让result=0好了

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
我认为是因为使用break的时候就跳出了本次循环,此时的result中没有值,但如果你用retrun的时候它把原来的值返回,再向下执行是跳出来时,result有值,所以会出现这个问题

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
在switch语句中,编译器必须确认你的任何一条可能通向“ txtResult.Text = Convert.ToString(result);”的路径都能给result赋值,你使用return的时候就不存在这条路径,因为直接返回了,没有可能访问result,但是你使用break就有可能访问到result了,而你的if语句里面并没有给result赋值,result可能成为一个未赋值的变量,所以会报错

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
return和break跳出的都是循环或者是switch,楼主的语句直接return后,
result = i1 / i2;
break;
是没有执行的,编译器当然会说result没有被赋初值喽

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
break后还要执行txtResult.Text = Convert.ToString(result);显然此时你并没有对result赋值,所以此处改为break不对。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您可以在switch语句完成后再return,这样绝不会耗费系统资源,因为switch语句里虽然有多个case但始终只执行一个,当前一个case满足执行条件时后面的case不会再执行,直到return位置,不会耗费资源

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马