Расширить синтаксис break в циклах для выхода из глубокой вложенности

Игорь Савенков
Игорь Савенков

Добавить возможность указывать количество циклов из которых нужно выйти

Например:

for (int i =0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        if (some1)
            break 2;
    }
}
// <- continue from here
 

 

 

-6
рейтинг
7 комментариев
al-mission-2016

Любопытно, но ненужно. Есть же уже божественное: goto CONTINUE_FROM_HERE;

al-mission-2016
Юрий Николаев
for (int i = 0; i < 10; i++)
{
	switch (i)
	{
		case 1:
		{
			for (int j = 0; j < 10; j++)
			{
				switch (j)
				{
					case 1:
					{
						if (some1)
							break 2;
					}
					break;
				}
			}
			// <- continue from here?
		}
		break;
	}
	// <- or continue from here?
}
// <- or continue from here?

Куда же должны попасть в данной ситуации?

Не, перегружать break идея плохая.

Юрий Николаев
Игорь Савенков

Юрий Николаев, я предполагаю, что такой синтаксис break 2 должен работать исключительно для циклов. Т.е. выход будет в самую последнюю точку "continue from here" игнорируя все switch.

Как бы да, получается несколько запутанный код, но надо понимать, что человек пишущий подобную глубину вложения, комбинируя циклы и switch - сам себе злобный буратино.

Альтернатива - новый оператор exitloop 2, например, хотя это overhead для такого частного случая

 

 

 

Игорь Савенков
Обновлено 
Igor Baidiuk

Как по мне, если уж делать - то через метки на блоках и labeled break/continue. Получается GOTO без кучи проблем GOTO.

Igor Baidiuk
Григорий Скурко

Напрашивается такую логику/пример выделить в функцию и делать return

Если уровней много и нужно между ними скакать - тоже самое - с подобным break тяжело будет код понимать

Григорий Скурко
NeoProgramming

Для этого лучшее решение - именованные блоки. То есть любой блок (if, while, for, switch...) может иметь опциональное имя, которое пишется после круглых скобок и перед телом блока, и которое можно использовать в break.

if(x>0) checkX {
  while(i != 100) MyLoop1 {
    switch(c) SelectAction {
      //... 
      break checkX;
      //...
    }
  }
}

Но я такое даже не предлагаю - слишком радикальное изменение в языке, никто на это не пойдет.

NeoProgramming
valera_ee

Подобное сделано в языке Swift, но синтаксис у них для этого напоминает goto в c++

valera_ee
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения