代码之家  ›  专栏  ›  技术社区  ›  SolutionYogi Eric Lippert

C拼图:可到达的Goto指向无法到达的标签

  •  4
  • SolutionYogi Eric Lippert  · 技术社区  · 16 年前

    这是埃里克·利珀特的评论 this post :

    既然你知道答案,你就可以 解决这个难题:给我写一个程序 其中有一个可到达的Goto 这就变成了一个无法到达的标签。艾斯 埃里克·利珀特7月17日7:17

    我无法创建一个代码,该代码将具有可到达的goto指向无法到达的标签。这是可能的吗?如果是,C代码会是什么样子?

    注意:我们不要讨论“goto”是如何坏的等等。这是一个理论练习。

    3 回复  |  直到 15 年前
        1
  •  13
  •   Sam Harwell    16 年前

    我的原始答案:

        try
        {
            goto ILikeCheese;
        }
        finally
        {
            throw new InvalidOperationException("You only have cottage cheese.");
        }
    ILikeCheese:
        Console.WriteLine("MMM. Cheese is yummy.");
    

    这里没有编译器警告。

        bool jumping = false;
        try
        {
            if (DateTime.Now < DateTime.MaxValue)
            {
                jumping = (Environment.NewLine != "\t");
                goto ILikeCheese;
            }
    
            return;
        }
        finally
        {
            if (jumping)
                throw new InvalidOperationException("You only have cottage cheese.");
        }
    ILikeCheese:
        Console.WriteLine("MMM. Cheese is yummy.");
    
        2
  •  0
  •   Pascal Paradis    15 年前

    顺便说一句,如果您使用goto-csharp编译器,例如在这种情况下,不使用finally block,代码将更改为不使用goto的版本。

    using System;
    public class InternalTesting
    {
    public static void Main(string[] args)
    {
      bool jumping = false;
        try
        {
            if (DateTime.Now < DateTime.MaxValue)
            {
                jumping = (Environment.NewLine != "\t");
                goto ILikeCheese;
            }
        else{
                return;
        }
        }
        finally
        {
            if (jumping)
    {
                //throw new InvalidOperationException("You only have cottage cheese.");
        Console.WriteLine("Test Me Deeply");
    }
        }
    ILikeCheese:
        Console.WriteLine("MMM. Cheese is yummy.");
    }
    }
    

    转向:

    public static void Main(string[] args)
    {
        bool flag = false;
        try
        {
            if (DateTime.Now < DateTime.MaxValue)
            {
                flag = Environment.NewLine != "\t";
            }
            else
            {
                return;
            }
        }
        finally
        {
            if (flag)
            {
                Console.WriteLine("Test Me Deeply");
            }
        }
        Console.WriteLine("MMM. Cheese is yummy.");
    }
    
        3
  •  0
  •   MadHak    15 年前
    goto cant_reach_me;
    
    try{
    cant_reach_me:
    }
    catch{}
    

    这不是编译错误,就是运行时错误,我记不得了。标签必须在try/catch块之外