ラベルつき break / continue について勘違いしてたこと - とはいえ…

1個前のエントリー で「この break, continue 文法は無いだろう!」と叫んでみたわけですが、これは今まで C++ / C# を弄ってきた身として「この goto文もどきの文法は無いだろう!」と解釈していたためです。

が、この解釈は正直間違っていました。 この構文について調べてみた所、次のように記述しているサイトを発見。

void test()
{
    KANA_LOOP: for(int k = 0; k < 10; ++k)
    {
        if(k >= 5)
            break KANA_LOOP;
    }
}

なるほど! つまりは、ループに名前を付け そのループに対する break/continue だと。 はー、なるほど。

例えば

public static void main(String[] args)
{
  SUIGINTOU_LOOP: for(int g = 0; g < 0; ++g)
  {
    KANARIA_LOOP: for(int k = 0; k < 10; ++k)
    {
      SUISEISEKI_LOOP: for(int m = 0; m < 10; ++m)
      {
        SOUSEISEKI_LOOP: for(int a = 0; a < 10; ++a)
        {
          SHINKU_LOOP: for(int j = 0; j < 10; ++j)
          {
            HINAICHIGO_LOOP: for(int h = 0; h < 10; ++h)
            {
              KIRAKISHO_LOOP: for(int i = 0; i < 10; ++i)
              {
                BARASUISYO_LOOP: for(int b = 0; b < 10; ++b)
                {
                  if(b >= 5)
                    break KANARIA_LOOP;
                }
              }
            }
          }
        }
      }
    }
  }
}

こうすれば、KANARIA_LOOP を break するのが一目でわかる、ほーなるほど。実は地味に良い構文だったりするかもしれない………?

いやーでも、for の頭がきれいにインデントされてないのが見づらいんだよなぁー。 実は、ラベルをお尻につけてみると見やすい構文になるんじゃないかしらかしら…!?

public static void main(String[] args)
{
  for(int g = 0; g < 0; ++g) SUIGINTOU_LOOP:
  {
    for(int k = 0; k < 10; ++k) KANARIA_LOOP:
    {
      for(int m = 0; m < 10; ++m) SUISEISEKI_LOOP:
      {
        for(int a = 0; a < 10; ++a) SOUSEISEKI_LOOP:
        {
          for(int j = 0; j < 10; ++j) SHINKU_LOOP:
          {
            for(int h = 0; h < 10; ++h) HINAICHIGO_LOOP:
            {
              for(int i = 0; i < 10; ++i) KIRAKISHO_LOOP:
              {
                for(int b = 0; b < 10; ++b) BARASUISYO_LOOP:
                {
                  if(b >= 5)
                    break KANARIA_LOOP;
                }
              }
            }
          }
        }
      }
    }
  }
}

微妙。

まとめ

  • ラベルは for の直前に書くべし。 決して1行上に書いてはならぬ。
  • つか、見づらい点は否めないので多用しちゃアカン。

よし!

ところで

色々実験してたんですが、こんなのが通ってしまいました。

// JDK 5u12
public static void main(String[] args)
{
  MIDO_LOOP: if(args.length >= 0)
  {
    GIN_LOOP: for(int g = 0; g < 0; ++g)
    {
      KANA_LOOP: for(int k = 0; k < 10; ++k)
      {
        if(k >= 4)
          break MIDO_LOOP;
      }
    }
    System.out.println("なのだわ");
  }
  else
  {
    System.out.println("かしら");  
  }
}

// -- 実行結果 --
// なのだわ

java
やっぱり
よくわからない
な。