Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Против часовой
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 3
#1

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

31.10.2013, 03:37. Просмотров 3221. Ответов 17
Метки нет (Все метки)

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

Оператор break как оператор go to next
Подскажите, в этом примере break эквивалентна действию оператора go to next?

Оператор break
Подскажите, пожалуйста почему оператор break в строке 44 выдаёт ошибку, и как...

Цикл for и оператор break
Привет всем. Задание такое я должен вводить элементы массива. Если ввод...

Оператор break выходит из цикла и ветвления?
Например код: for(int j=0; j<10; j++) { if(j<10) cout<<"Выход!";break;...

Вычислить таблицу значений функции, используя switch в паре с break, оператор перехода goto
Доброго вам времени суток. Есть самое бредовое задание которое я только видел...

Программа для выполнения:При вводе цифры от 0 до 9 будет выводиться ее название. Использовать оператор break
Помогите пожалуйста заменить в программе оператор goto на оператор break...

17
Urnwestek
267 / 125 / 6
Регистрация: 20.10.2013
Сообщений: 196
31.10.2013, 03:50 #2
Это вопрос, скорее, эстетики и мнения на этот счёт самые разные.
1
mytilus
83 / 83 / 26
Регистрация: 04.10.2012
Сообщений: 340
31.10.2013, 04:14 #3
Использование break ухудшает читаемость кода человеком. Конечно, удобно, когда все условия выхода из цикла указаны в одном месте. Но я считаю так: хочешь ставить break - ставь break.
1
Против часовой
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 3
31.10.2013, 09:45  [ТС] #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.
0
mytilus
83 / 83 / 26
Регистрация: 04.10.2012
Сообщений: 340
31.10.2013, 10:10 #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) прыжок из цикла.

Ответ, по-моему, очевиден. ))
1
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.10.2013, 11:45 #6
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Против часовой Посмотреть сообщение
Второй вариант короче но там break.
Второй вариант очевидный - выход из цикла, тогда как первый как минимум обязывает помнить условие окончания цикла

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

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

Не по теме:

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

0
ValeryS
31.10.2013, 12:02
  #9

Не по теме:

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

0
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
31.10.2013, 12:02 #10
break - завуалированный goto </trololo>
0
Jupiter
31.10.2013, 12:03
  #11

Не по теме:

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

0
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
31.10.2013, 12:04 #12
Цитата Сообщение от Jupiter Посмотреть сообщение
Croessmah, я думаю что хороший компилятор сделает это сам
выкинет пустой цикл?
0
Jupiter
31.10.2013, 12:05
  #13

Не по теме:

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

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

Не по теме:

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

0
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
31.10.2013, 13:08 #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, это досрочный вызод из цикла(можете даже считать, что аварийный ), поэтому от привычки заменять им условия выхода из цикла нужно избавляться.
1
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
31.10.2013, 18:17 #17
rangerx, мне первый вариант больше нравится, там i не пихают во внешнюю область видимости. Я бы сделал так:
C++
1
2
3
bool flag = false;
for(int i = 0; i < n && !flag; ++i)
    flag = (a[i] == 2);
Jupiter, я как бы хотел намекнуть, что и то фигня и это фигня, пустой цикл выкинет и там и там.
1
mytilus
83 / 83 / 26
Регистрация: 04.10.2012
Сообщений: 340
31.10.2013, 23:42 #18
Любой цикл - это завуалированный goto. Любое приложение - это целый склад завуалированных goto и call/retn. Я уже писал, что выходы из цикла, раскиданные по всему телу этого цикла, затрудняют восприятие исходного кода (я имею в виду чтение кода "с листа", когда еще нет четкого понимания того, что именно делает программа).
С точки зрения оптимизации, выход из цикла должен происходить сразу же при выполнении условия, не дожидаясь завершения всей итерации.
1
31.10.2013, 23:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 23:42
Привет! Вот еще темы с решениями:

While{switch{switch{break;}}} break выходит из while
В общем необходимо конструкцию switch запускать в цикле, в каждом case X: стоит...

Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки
Здравствуйте. В С++ я абсолютный новичок, поэтому с первым же заданием возникли...

Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1
В С++ я ноль, помогите пожалуйста написать прогу Написать программу,...

Инструкция break
Эм, балуюсь с C++. Значит, отбираю простые числа, первый вариант программы: ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru