Форум программистов, компьютерный форум CyberForum.ru

оператор break - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Против часовой
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 3
31.10.2013, 03:37     оператор break #1
Здравствуйте! Я где-то слышал, что использовать оператор break для выхода из цикла - не хорошо. И что его можно использовать только если без него совсем никак не получается. Я правильно понимаю?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2013, 03:37     оператор break
Посмотрите здесь:

Break и return C++
C++ Оператор break
Путаница с break C++
C++ Вычислить таблицу значений функции, используя switch в паре с break, оператор перехода goto
C++ Инструкция break
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Urnwestek
264 / 122 / 6
Регистрация: 20.10.2013
Сообщений: 196
31.10.2013, 03:50     оператор break #2
Это вопрос, скорее, эстетики и мнения на этот счёт самые разные.
mytilus
82 / 82 / 8
Регистрация: 04.10.2012
Сообщений: 329
31.10.2013, 04:14     оператор break #3
Использование break ухудшает читаемость кода человеком. Конечно, удобно, когда все условия выхода из цикла указаны в одном месте. Но я считаю так: хочешь ставить break - ставь break.
Против часовой
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 3
31.10.2013, 09:45  [ТС]     оператор break #4
Ну а вот как лучше?
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(i=0;i<a;i++)
{
b+=i;
if(b>c)
{
i=a;
}
else
{
c++;
}
}
или

C++
1
2
3
4
5
6
7
8
9
for(i=0;i<a;i++)
{
b+=i;
if(b>c)
{
break;
}
c++;
}
Второй вариант короче но там break.
mytilus
82 / 82 / 8
Регистрация: 04.10.2012
Сообщений: 329
31.10.2013, 10:10     оператор break #5
Для этого надо иметь представление о том, как все это выглядит после компиляции.
Первый вариант:
C++
1
2
3
4
for (i = 0; i < a; i++) {
  b += i;
  if (b > c) i = a;
  else c++;}
Когда b окажется больше, чем c, и процессор в этом убедится, произойдет следующее:
1) копирование из смещения i в регистр;
2) копирование из регистра в смещение a;
3) прыжок через блок else;
4) инкремент регистра;
5) прыжок в начало цикла;
6) сравнение смещения a и регистра;
7) прыжок из цикла.

Второй вариант:
C++
1
2
3
4
for (i = 0; i < a; i++) {
  b += i;
  if (b > c) break;
  c++;}
После проверки (b > c) будет так:
1) прыжок из цикла.

Ответ, по-моему, очевиден. ))
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.10.2013, 11:45     оператор break #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Против часовой Посмотреть сообщение
Второй вариант короче но там break.
Второй вариант очевидный - выход из цикла, тогда как первый как минимум обязывает помнить условие окончания цикла

Добавлено через 1 минуту
Цитата Сообщение от Против часовой Посмотреть сообщение
Я где-то слышал, что использовать оператор break для выхода из цикла - не хорошо.
использоать if тоже нехорошо. и switch тоже. и циклы. и вообще программирование на физической машине вне твоего разума - нехорошо. лучший код - не написанный код.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
31.10.2013, 11:58     оператор break #7
Цитата Сообщение от Против часовой Посмотреть сообщение
Здравствуйте! Я где-то слышал, что использовать оператор break для выхода из цикла - не хорошо.
А где слышал? источник пожалуйста
с ГоТо не перепутал?
Цитата Сообщение от Против часовой Посмотреть сообщение
И что его можно использовать только если без него совсем никак не получается.
это можно сказать про любой оператор, функцию.....
как говорит великий могучий русский язык "С дуру, можно и хребет сломать"

Добавлено через 3 минуты
простейший пример
индекс первого отрицательного числа
C++
1
2
3
for(i=0;i<n;i++)
 if(a[i]<0)
   break;
как более понятно написать без break?????
Croessmah
31.10.2013, 12:01
  #8

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
как более понятно написать без break?????
C++
1
2
    for(i=0;i<n && a[i]>=0;i++){
    }

ValeryS
31.10.2013, 12:02
  #9

Не по теме:

Croessmah,
не подсказывать

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
31.10.2013, 12:02     оператор break #10
break - завуалированный goto </trololo>
Jupiter
31.10.2013, 12:03
  #11

Не по теме:

Croessmah, я думаю что хороший компилятор сделает это сам

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
31.10.2013, 12:04     оператор break #12
Цитата Сообщение от Jupiter Посмотреть сообщение
Croessmah, я думаю что хороший компилятор сделает это сам
выкинет пустой цикл?
Jupiter
31.10.2013, 12:05
  #13

Не по теме:

Цитата Сообщение от MrGluck Посмотреть сообщение
выкинет пустой цикл?
нет, совместит условие иф с условием выхода из цикла

ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
31.10.2013, 12:06     оператор break #14
Цитата Сообщение от MrGluck Посмотреть сообщение
break - завуалированный goto
ну можно так сказать
но лучше он сам за себя говорит break -"ломатель"
ломает цикл
contine тоже можно сказать завуалированный goto
Croessmah
31.10.2013, 12:06
  #15

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
Croessmah, я думаю что хороший компилятор сделает это сам
ну так вопрос же не о компиляторах

rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
31.10.2013, 13:08     оператор break #16
Цитата Сообщение от Против часовой Посмотреть сообщение
Здравствуйте! Я где-то слышал, что использовать оператор break для выхода из цикла - не хорошо. И что его можно использовать только если без него совсем никак не получается. Я правильно понимаю?
В общем случае, да. Могу привести простой пример, подобие которого можно часто увидеть на форуме
C++
1
2
3
4
5
6
7
8
9
bool flag = false;
for(int i = 0; i < n; ++i)
{
  if(a[i] == 2)
  {
    flag = true;
    break;
  }
}
В данном случае, проверяется наличие в массиве a числа 2 . После выхода из цикла результат зависит от состояния переменной flag. То же самое, но без использования break
C++
1
2
3
int i = 0;
while((i < n) && (a[i] != 2))
  ++i;
Здесь приi i !=n поиск завершился успешно. Т.е., из-за привычки использовать break до второго варианта можно элементарно не додуматься. Всё это не значит, что нужно избегать использование этого оператора, просто нужно помнить, что break, это досрочный вызод из цикла(можете даже считать, что аварийный ), поэтому от привычки заменять им условия выхода из цикла нужно избавляться.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
31.10.2013, 18:17     оператор break #17
rangerx, мне первый вариант больше нравится, там i не пихают во внешнюю область видимости. Я бы сделал так:
C++
1
2
3
bool flag = false;
for(int i = 0; i < n && !flag; ++i)
    flag = (a[i] == 2);
Jupiter, я как бы хотел намекнуть, что и то фигня и это фигня, пустой цикл выкинет и там и там.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 23:42     оператор break
Еще ссылки по теме:

C++ Оператор break как оператор go to next
C++ Цикл do.while и break
Программа для выполнения:При вводе цифры от 0 до 9 будет выводиться ее название. Использовать оператор break C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
mytilus
82 / 82 / 8
Регистрация: 04.10.2012
Сообщений: 329
31.10.2013, 23:42     оператор break #18
Любой цикл - это завуалированный goto. Любое приложение - это целый склад завуалированных goto и call/retn. Я уже писал, что выходы из цикла, раскиданные по всему телу этого цикла, затрудняют восприятие исходного кода (я имею в виду чтение кода "с листа", когда еще нет четкого понимания того, что именно делает программа).
С точки зрения оптимизации, выход из цикла должен происходить сразу же при выполнении условия, не дожидаясь завершения всей итерации.
Yandex
Объявления
31.10.2013, 23:42     оператор break
Ответ Создать тему
Опции темы

Текущее время: 08:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru