为什么这个程序输出2而不是3啊?

debugdebugger 2015-04-04 11:01:14
class Program
{
static void Main(string[] args)
{

int n = a();
Console.WriteLine("{0}",n);//2
}
static int a()
{
int x = 1;

try
{
return ++x;
}
catch (Exception e)
{

}
finally
{
++x;
}
return x;
}
}



调试过程中发现执行到finally里时,x的确变成3了
但为什么最后还是输出try里的那个++x得到的2啊

新手,IL还看不懂,这是a()的IL

.method private hidebysig static int32 a() cil managed
{
// 代码大小 35 (0x23)
.maxstack 2
.locals init ([0] int32 x,
[1] class [mscorlib]System.Exception e,
[2] int32 CS$1$0000)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
.try
{
.try
{
IL_0003: nop
IL_0004: ldloc.0
IL_0005: ldc.i4.1
IL_0006: add
IL_0007: dup
IL_0008: stloc.0
IL_0009: stloc.2
IL_000a: leave.s IL_0020
} // end .try
catch [mscorlib]System.Exception
{
IL_000c: stloc.1
IL_000d: nop
IL_000e: nop
IL_000f: leave.s IL_0011
} // end handler
IL_0011: nop
IL_0012: leave.s IL_001b
} // end .try
finally
{
IL_0014: nop
IL_0015: ldloc.0
IL_0016: ldc.i4.1
IL_0017: add
IL_0018: stloc.0
IL_0019: nop
IL_001a: endfinally
} // end handler
IL_001b: nop
IL_001c: ldloc.0
IL_001d: stloc.2
IL_001e: br.s IL_0020
IL_0020: nop
IL_0021: ldloc.2
IL_0022: ret
} // end of method Program::a


...全文
334 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_22042041 2015-04-08
  • 打赏
  • 举报
回复
try里面不是有return了?
bbjiabcd 2015-04-08
  • 打赏
  • 举报
回复
try里面的return已经将x的值2取出了,准备赋给n,此时执行++x并不影响已经取出的值,且finally后的return 不会执行
tcmakebest 2015-04-05
  • 打赏
  • 举报
回复
研究这么模棱两可的问题太雕虫小技了,这里面没有什么大道理可以领悟的,只要接受事实就行,不必非要找一个理由来证明点什么.
hwyqy 2015-04-05
  • 打赏
  • 举报
回复
try里,已经返回值了,值被临时存储后,再去执行了finally中的语句
debugdebugger 2015-04-05
  • 打赏
  • 举报
回复
就是这个[2] int32 CS$1$0000) 是吧
john_QQ:2335298917 2015-04-05
  • 打赏
  • 举报
回复
你在try里先返回了,所以是2
江南小鱼 2015-04-05
  • 打赏
  • 举报
回复
try里面,已经return了
IL_000a:  leave.s    IL_0020
无论try、catch是否leave,最终代码都会执行finally 看IL你会发现:会改变变量值,但是不包含leave 尽快try有return语句,代码还是执行到finally,C#就是这么设计的 最后面的return是执行不到的,IL你可以看不到leave.s
江南小鱼 2015-04-05
  • 打赏
  • 举报
回复
try里面,已经return了
IL_000a:  leave.s    IL_0020
无论try、catch是否leave,最终代码都会执行finally 看IL你会发现:会改变变量值,但是不包含leave 尽快try有return语句,代码还是执行到finally,C#就是这么设计的 最后面的return是执行不到的,IL你可以看不到leave.s
  • 打赏
  • 举报
回复
果然又是try,finally的问题 其实你可以试下另一种 static int a(ref int x) 看会有什么样的结果
zhuayi112 2015-04-05
  • 打赏
  • 举报
回复
返回的时候 +1 就是2了啊 很简单的道理
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
你写代码
            finally
            {
                ++x;
            }
            return x;
这就无意中自己蒙了自己。 测试需要创意,因此你应该自己去想到要写 x*10000 之类的代码。不要让自己的思想禁锢在特别僵化的“正统”套子中。
正解
debugdebugger 2015-04-05
  • 打赏
  • 举报
回复
引用 10 楼 tcmakebest 的回复:
研究这么模棱两可的问题太雕虫小技了,这里面没有什么大道理可以领悟的,只要接受事实就行,不必非要找一个理由来证明点什么.
本来就没有“研究”啊,只是想知道为什么会这样,你又怎么得到“找一个理由来证明点什么.”这样的结论啊。。。 你肯定没少和别人“吵架”吧
Liekkas 2015-04-05
  • 打赏
  • 举报
回复


        static void Main()
        {
            int a = aa();
            Console.WriteLine("{0}",a);
            Console.ReadLine();        
        }

        static int aa()
        {
            int a = 0;
            int b = 1;

            try
            {
                int c = b / a;
                Console.WriteLine("1");
            }
            catch
            {
                Console.WriteLine("2");
                return  0;
            }
            finally
            {
                Console.WriteLine("3");
            }
            return 1;
        }
    
本拉灯 2015-04-04
  • 打赏
  • 举报
回复
class Program { static void Main(string[] args) { int n = a(); Console.WriteLine("{0}",n);//2 } 被编译后 static int a() { int x = 1; int t=0; 这里会多一个临时变量 try { return ++x; //这里先返回了 } catch (Exception e) { } finally { t = ++x; } return t; 程序不会执行到这里,编译器会优化这部份代码 } }
  • 打赏
  • 举报
回复
你写代码
            finally
            {
                ++x;
            }
            return x;
这就无意中自己蒙了自己。 测试需要创意,因此你应该自己去想到要写 x*10000 之类的代码。不要让自己的思想禁锢在特别僵化的“正统”套子中。
  • 打赏
  • 举报
回复
class Program
{
    static void Main(string[] args)
    {

        int n = a();
        Console.WriteLine("{0}", n);//2
    }
    static int a()
    {
        int x = 1;

        try
        {
            return ++x;
        }
        catch (Exception e)
        {

        }
        finally
        {
            ++x;
        }
        return x * 10000;
    }
}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧