break в С++ (Выход из функции)

Модератор: Модераторы разделов

Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: break в С++

Сообщение Stauffenberg »

gavrasio писал(а):
16.12.2015 00:59
Там насчёт литературы были ссылки, но одни говорят, что то дерьмо, другие молятся на те книжки.Я сижу на трёх неделях С++.

Я в универе начинал с "Язык программировани С++. Лекции и упражнения" Стивен Прата. Годное чтиво.
Потом, правда, поймал себя на мысли, что слишком быстро проскочил курс и вернулся к азам - более глубокому изучению С. А лучшая книга по С это, как известно, "Язык программирования Си" Брайан Керниган и Деннис Ритчи.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: break в С++

Сообщение yoshakar »

gavrasio, я бы вам посоветовал забыть что есть такие штуки как break, return (и тем более goto) и обходиться в течение, скажем, года без них. Таким образом, когда вы к ним вернётесь, у вас будет уже совсем иная картина в голове и вы их поймёте и будет использовать без труда. "Обходиться без return" в данном случае означает писать только один return в каждой функции и только в самом её конце - то есть только чтобы вернуть результат, а не чтобы досрочно прерывать функцию.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

yoshakar писал(а):
16.12.2015 01:35
gavrasio, я бы вам посоветовал забыть что есть такие штуки как break, return (и тем более goto) и обходиться в течение, скажем, года без них. Таким образом, когда вы к ним вернётесь, у вас будет уже совсем иная картина в голове и вы их поймёте и будет использовать без труда. "Обходиться без return" в данном случае означает писать только один return в каждой функции и только в самом её конце - то есть только чтобы вернуть результат, а не чтобы досрочно прерывать функцию.

Без этих штучек я обхожусь нормально. С ними интересней. А с GO TO я ещё с Бейскика ох как хорошо дружу, - там это основной оператор. А по теме, по совету Форума, нарыл, пока инфы хватит. Хотя литературу знакомую что-то не вижу.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: break в С++

Сообщение NickLion »

gavrasio писал(а):
15.12.2015 23:32
Но она обозначена как int. А мне надо из неё выйти. Без всяких дополнительных условий.

1.

Код: Выделить всё

int func(int a)
{
    // some code
    if (a==0)
        // здесь гиптетический абсолютно-безусловный выход
    return a;
}
// ...
int k = func(5);

Что по Вашему должно быть в переменной k при этом "безусловном выходе"

2. Есть механизм исключений, который позволяет прервать выполнение функции и не возвращать, но нужно где-то ловить данное исключение и обрбатывать его, если обработки нет, то завершается и функция выше по стеку до тех пор, пока не будет найден обработчик. Если же его совсем нет (совместимого по типу исключения), то будет завершена программа.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

yoshakar писал(а):
16.12.2015 01:35
писать только один return в каждой функции и только в самом её конце

Это бывает очень сложно и иногда приводит к крайне перегруженным конструкциям из вложенных if-else. Лучше всё же вызывать return в каждом месте, где становится ясно, что дальше функция ничего полезного не сделает.

gavrasio писал(а):
16.12.2015 01:52
с GO TO я ещё с Бейскика ох как хорошо дружу

Значит пора разорвать эту дружбу. Здесь Вам не тут, а C/C++ Вам не Васик. В выше упоминавшейся книге Кернигана и Ритчи приводятся ровно два случая, когда использование goto в C оправдано (цитировать не буду, сами прочитаете при желании). Причём я бы имел наглость с ними поспорить и сократить это количество до одного.

gavrasio писал(а):
16.12.2015 00:19
Безусловного выхода из любой функции, я так понял, нет
Не путайтесь в терминологии. Вы же хотите
gavrasio писал(а):
16.12.2015 00:39
Просто выйти по условию
То есть Вам нужен как раз условный выход.
А написатьили

Код: Выделить всё

return -1;
или

Код: Выделить всё

return NULL;
— какая, по большому счёту, разница? Внутри данной конкретной функции один и тот же вариант всегда будет работать, в любом её месте.

P. S. C++ за три недели не освоить (и судя по тому, что теме уже 5 месяцев, Вы в этом должны были убедиться), а книжки, которые предлагают это сделать, можно не глядя сдавать в макулатуру.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

NickLion писал(а):
16.12.2015 12:47
gavrasio писал(а):
15.12.2015 23:32
Но она обозначена как int. А мне надо из неё выйти. Без всяких дополнительных условий.

1.

Код: Выделить всё

int func(int a)
{
    // some code
    if (a==0)
        // здесь гиптетический абсолютно-безусловный выход
    return a;
}
// ...
int k = func(5);

Что по Вашему должно быть в переменной k при этом "безусловном выходе"



Ну, конечно к=5. А безусловным переходом( выходом), наверное, всё-таки есть go to loop N.
А механизм исключений - это высший пилотаж, подавляющее большинство юзеров даже не знает, что это.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

gavrasio писал(а):
16.12.2015 21:43
конечно к=5

Почему? Какой логикой должна руководствоваться функция, чтобы вернуть такое значение? Или какой логикой должен руководствоваться язык программирования, чтобы присвоить такое значение переменной, когда функция ничего не вернула?

gavrasio писал(а):
16.12.2015 21:43
А механизм исключений - это высший пилотаж, подавляющее большинство юзеров даже не знает, что это.

К сожалению, слишком многие знают и постоянно злоупотребляют.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
16.12.2015 21:53
gavrasio писал(а):
16.12.2015 21:43
конечно к=5

Почему? Какой логикой должна руководствоваться функция, чтобы вернуть такое значение? Или какой логикой должен руководствоваться язык программирования, чтобы присвоить такое значение переменной, когда функция ничего не вернула?



Если а не равно нулю, то оно равняется результатом some code.
На Ваше замечание про три недели, - это всё уже где-то три года, первое, что я увидел и прочитал. Нормально три недели длятся.

Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: break в С++

Сообщение NickLion »

Предполагалось, что Ваш код устанавливает a в значение 0. Ну, пусть будет

Код: Выделить всё

int k = func(0);

Вопрос остання прежним, чему равно k?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

gavrasio писал(а):
16.12.2015 22:13
Если а не равно нулю, то оно равняется результатом some code.

Подразумевалось, что выход таки произошёл, то есть a равно 0.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: break в С++

Сообщение yoshakar »

Bizdelnick писал(а):
16.12.2015 12:53
Это бывает очень сложно и иногда приводит к крайне перегруженным конструкциям из вложенных if-else. Лучше всё же вызывать return в каждом месте, где становится ясно, что дальше функция ничего полезного не сделает.
Я абсолютно согласен, но мне кажется это полезным для учебных целей: позволет лучше прочувствовать суть структурного программирования, заставлет поработать мозгами лишний раз, и наконец способствует действительному пониманию полезности return. Высказанное есть гипотеза, родившаяся у меня под влиянием этого треда.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

NickLion писал(а):
16.12.2015 22:24
Предполагалось, что Ваш код устанавливает a в значение 0. Ну, пусть будет

Код: Выделить всё

int k = func(0);

Вопрос остання прежним, чему равно k?

k равняется результатом выполнения функции func при принятии ею аргумента "0". Что случится с этим нулём до if известно только some code.
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: break в С++

Сообщение yoshakar »

gavrasio писал(а):
16.12.2015 23:06
Что случится с этим нулём до if известно только some code.
Рассмотрим простейший вариант: пусть "some code" отсутствует, то есть функция такая:

Код: Выделить всё

int func(int a)
{
    if (a==0)
        // здесь гиптетический абсолютно-безусловный выход
    return a;
}
В таком случае чему будет равняться k?
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

yoshakar писал(а):
16.12.2015 23:13
gavrasio писал(а):
16.12.2015 23:06
Что случится с этим нулём до if известно только some code.
Рассмотрим простейший вариант: пусть "some code" отсутствует, то есть функция такая:

Код: Выделить всё

int func(int a)
{
    if (a==0)
        // здесь гиптетический абсолютно-безусловный выход
    return a;
}
В таком случае чему будет равняться k?

k равняется нулю.
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: break в С++

Сообщение yoshakar »

gavrasio писал(а):
16.12.2015 23:22
k равняется нулю.
А что тогда должно быть написано в "some code", чтобы k получилось не 0, а, например, 1?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

gavrasio писал(а):
16.12.2015 23:06
k равняется результатом выполнения функции func при принятии ею аргумента "0". Что случится с этим нулём до if известно только some code.

А каков результат выполнения функции, если в ней был вызван желаемый Вами аналог break?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

yoshakar писал(а):
16.12.2015 23:30
gavrasio писал(а):
16.12.2015 23:22
k равняется нулю.
А что тогда должно быть написано в "some code", чтобы k получилось не 0, а, например, 1?

some code
a=a+1;


Bizdelnick писал(а):
16.12.2015 23:45
gavrasio писал(а):
16.12.2015 23:06
k равняется результатом выполнения функции func при принятии ею аргумента "0". Что случится с этим нулём до if известно только some code.

А каков результат выполнения функции, если в ней был вызван желаемый Вами аналог break?

Любой, отличный от условия выхода из функции.
if(a==0)
return b;
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

gavrasio писал(а):
16.12.2015 23:53
Любой, отличный от условия выхода из функции.

Не понял.

Код: Выделить всё

int k = func();
std::cout << k;
Что получим?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
16.12.2015 23:58
gavrasio писал(а):
16.12.2015 23:53
Любой, отличный от условия выхода из функции.

Не понял.

Код: Выделить всё

int k = func();
std::cout << k;
Что получим?

Разверните вверх "Ваш" код, пожалуйста.
Допустим
int func(a)
{
some code a;
some code b;
if(a==0)
return b;
}
cout<<b;
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

gavrasio писал(а):
17.12.2015 00:04
Разверните вверх "Ваш" код, пожалуйста.

В func() выполняется некая проверка, по результатам которой вызывается желанный Вами superbreak. До return, который Вам не нравится, не доходит. Конкретного кода, извините, написать не могу, потому что это то, чего вроде как хотите Вы, а не то, что можно написать на реальном C++.
Upd. Впрочем, пусть будет так:

Код: Выделить всё

#include <iostream>

int func()
{
  int i;
  std::cin >> i;
  if (i < 0)
    superbreak; // я не знаю, как это работает
  return i * 2;
}

int main()
{
  int k = func();
  std::cout << k;
  return 0;
}
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

superbraek?! Над этим надо поработать, - слышу впервые.
Если, конечно, это не шутка.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Не нашёл superbraek. Superwhile есть.
Спасибо сказали:
Аватара пользователя
ieleja
Сообщения: 307
ОС: Debian 9, macOS, Windows
Контактная информация:

Re: break в С++

Сообщение ieleja »

Код: Выделить всё

//  main.cpp
//  superBreak

#include <iostream>
using namespace std;

double superBreak(int a, int b)
{
    throw "superbreak!";

    return (a * b);
}

int main ()
{
    int x = 50;
    int y = 0;
    double z = 0;

    try
    {
        z = superBreak(x, y);
        cout << z << endl;
    }
    catch (const char* msg)
    {
        cerr << msg << endl;
    }

    return 0;
}
ad infinitum
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: break в С++

Сообщение NickLion »

Давайте ещё раз и по порядку. В самом начале Ваш вопрос выглядел так:
gavrasio писал(а):
19.07.2015 15:43
Где, кроме switch и for применима команда break? Как сделать моментальный выход из функции по типу break?

Что должна вернуть функция, которая возвращает int, при желанном Вами "моментальном" выходе?
При том, что ниже Вы сказали:
gavrasio писал(а):
15.12.2015 20:21
Но безоговорочный return не проходит по всякому, если функция определена с int, компилятор требует возвращаемое значение. А хотелось бы выйти из функции при определённом условии без всяких дополнительных (!) условий.

Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

gavrasio писал(а):
17.12.2015 00:33
superbraek?! Над этим надо поработать, - слышу впервые.
Если, конечно, это не шутка.

Это не шутка. Это несуществующая инструкция, делающая то, что Вы хотите. Я не могу понять, как она должна работать, и хочу, чтобы Вы это объяснили, для чего и придумал этот пример.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
17.12.2015 12:45
gavrasio писал(а):
17.12.2015 00:33
superbraek?! Над этим надо поработать, - слышу впервые.
Если, конечно, это не шутка.

Это не шутка. Это несуществующая инструкция, делающая то, что Вы хотите. Я не могу понять, как она должна работать, и хочу, чтобы Вы это объяснили, для чего и придумал этот пример.

Наверное, так. Если функция void, то retuern выводит из функции без сохранения локальных переменных. Если int, выводит retuern(a), но так как a может быть глобальной, то ничего не выводит. Если я определю функцию с аргументом как ссылка или определитель и буду возвращать адрес переменной, я и из функции выйду моментально и сохраню обрабатываемую переменную( значение её).
Это совет bortmand:

Так вы ее по значению передаете, как же она вернется обратно-то...
По указателю (C/C++):
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

Я ничего не понял в Вашем ответе. Напишите, каков должен быть результат выполнения программы, код которой я привёл выше, при условии, что superbreak — это инструкция, которую Вы хотели бы видеть в C++ и о которой создали эту тему, и пользователь вводит отрицательное число (для определённости, скажем, -2). В коде нет ни глобальных переменных, ни ссылок, ни указателей, если вдруг Вы этого не заметили.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

Bizdelnick писал(а):
17.12.2015 00:14
gavrasio писал(а):
17.12.2015 00:04
Разверните вверх "Ваш" код, пожалуйста.

В func() выполняется некая проверка, по результатам которой вызывается желанный Вами superbreak. До return, который Вам не нравится, не доходит. Конкретного кода, извините, написать не могу, потому что это то, чего вроде как хотите Вы, а не то, что можно написать на реальном C++.
Upd. Впрочем, пусть будет так:

Код: Выделить всё

#include <iostream>

int func()
{
  int i;
  std::cin >> i;
  if (i < 0)
    superbreak; // я не знаю, как это работает
  return i * 2;
}

int main()
{
  int k = func();
  std::cout << k;
  return 0;
}


Если superbreak развернуть как:

Код: Выделить всё

return(1);
else

и i=-2, то k=1.


ieleja писал(а):
17.12.2015 06:34

Код: Выделить всё

//  main.cpp
//  superBreak

#include <iostream>
using namespace std;

double superBreak(int a, int b)
{
    throw "superbreak!";

    return (a * b);
}

int main ()
{
    int x = 50;
    int y = 0;
    double z = 0;

    try
    {
        z = superBreak(x, y);
        cout << z << endl;
    }
    catch (const char* msg)
    {
        cerr << msg << endl;
    }

    return 0;
}

Это всё правильно, но немного сложновато, хотя и поучительно.
Спасибо сказали:
gavrasio
Сообщения: 109
ОС: Mageia 4

Re: break в С++

Сообщение gavrasio »

ieleja писал(а):
17.12.2015 06:34

Код: Выделить всё

//  main.cpp
//  superBreak

#include <iostream>
using namespace std;

double superBreak(int a, int b)
{
    throw "superbreak!";

    return (a * b);
}

int main ()
{
    int x = 50;
    int y = 0;
    double z = 0;

    try
    {
        z = superBreak(x, y);
        cout << z << endl;
    }
    catch (const char* msg)
    {
        cerr << msg << endl;
    }

    return 0;
}

OFF TOP. На эту тему можно открыть новую тему, Но, наверное, не всем она будет интересна.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: break в С++

Сообщение Bizdelnick »

gavrasio писал(а):
19.12.2015 00:38
Если superbreak развернуть как:

Код: Выделить всё

return(1);
else

и i=-2, то k=1.

Вот! Наконец-то! Как Вы видите, без return обойтись не получается. Следующий вопрос — почему должна возвращаться именно единица? А если единица — допустимое значение при каких-то иных входных данных, и это нарушит логику программы? Не лучше ли явно прописать, что надо возвращать?
Да, кстати, else тут не нужен.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить