Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 3

оператор break

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

Студворк — интернет-сервис помощи студентам
Здравствуйте! Я где-то слышал, что использовать оператор break для выхода из цикла - не хорошо. И что его можно использовать только если без него совсем никак не получается. Я правильно понимаю?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2013, 03:37
Ответы с готовыми решениями:

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

Оператор break
Подскажите, пожалуйста почему оператор break в строке 44 выдаёт ошибку, и как её исправить? #include<iostream.h> ...

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

17
268 / 126 / 6
Регистрация: 20.10.2013
Сообщений: 196
31.10.2013, 03:50
Это вопрос, скорее, эстетики и мнения на этот счёт самые разные.
1
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
31.10.2013, 04:14
Использование break ухудшает читаемость кода человеком. Конечно, удобно, когда все условия выхода из цикла указаны в одном месте. Но я считаю так: хочешь ставить break - ставь break.
1
0 / 0 / 0
Регистрация: 31.10.2013
Сообщений: 3
31.10.2013, 09:45  [ТС]
Ну а вот как лучше?
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
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
31.10.2013, 10:10
Для этого надо иметь представление о том, как все это выглядит после компиляции.
Первый вариант:
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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
31.10.2013, 11:45
Лучший ответ Сообщение было отмечено как решение

Решение

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

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

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

Не по теме:

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

0
31.10.2013, 12:02

Не по теме:

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

0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.10.2013, 12:02
break - завуалированный goto </trololo>
0
31.10.2013, 12:03

Не по теме:

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

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

Не по теме:

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

0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
31.10.2013, 12:06
Цитата Сообщение от MrGluck Посмотреть сообщение
break - завуалированный goto
ну можно так сказать
но лучше он сам за себя говорит break -"ломатель"
ломает цикл
contine тоже можно сказать завуалированный goto
0
31.10.2013, 12:06

Не по теме:

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

0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
31.10.2013, 13:08
Цитата Сообщение от Против часовой Посмотреть сообщение
Здравствуйте! Я где-то слышал, что использовать оператор 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
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.10.2013, 18:17
rangerx, мне первый вариант больше нравится, там i не пихают во внешнюю область видимости. Я бы сделал так:
C++
1
2
3
bool flag = false;
for(int i = 0; i < n && !flag; ++i)
    flag = (a[i] == 2);
Jupiter, я как бы хотел намекнуть, что и то фигня и это фигня, пустой цикл выкинет и там и там.
1
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
31.10.2013, 23:42
Любой цикл - это завуалированный goto. Любое приложение - это целый склад завуалированных goto и call/retn. Я уже писал, что выходы из цикла, раскиданные по всему телу этого цикла, затрудняют восприятие исходного кода (я имею в виду чтение кода "с листа", когда еще нет четкого понимания того, что именно делает программа).
С точки зрения оптимизации, выход из цикла должен происходить сразу же при выполнении условия, не дожидаясь завершения всей итерации.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.10.2013, 23:42
Помогаю со студенческими работами здесь

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

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

Программа для выполнения:При вводе цифры от 0 до 9 будет выводиться ее название. Использовать оператор break
Помогите пожалуйста заменить в программе оператор goto на оператор break #include &lt;iostream&gt; using namespace std; const...

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru