При выходе из функции main программа заканчивается

Завершает текущую функцию и возвращает указанное значение (если оно есть)вызывающей стороне.

Syntax

attr(optional) return expression(optional) ; (1)
attr(optional) return braced-init-list ; (2) (since C++11)
attr(optional) co_return expression(optional) ; (3) (since C++20)
attr(optional) co_return braced-init-list ; (4) (since C++20)
attr (начиная с C++11) последовательность любого количества атрибутов
expression выражение , конвертируемое в тип возвращаемого значения функции
braced-init-list закрытый список инициализаторов и другие списки скреплённых фигурными скобками

Explanation

1) Оценивает выражение, завершает текущую функцию и возвращает результат выражения вызывающей стороне после неявного преобразования в возвращаемый тип функции. Выражение является необязательным в функциях, чей тип возврата (возможно, cv-квалифицированный) void , и запрещен в конструкторах и в деструкторах.

Конструкция __MAIN__ для чего и кому нужна.

2) Использует copy-list-initialization для создания возвращаемого значения функции.

3,4) В сопрограмме ключевое слово co_return должно использоваться вместо return для конечной точки приостановки ( подробности см. В сопрограммах ).

Notes

Если управление достигает конца.

  • функция с возвращаемым типом (возможно, cv-qualified) void ,
  • a constructor,
  • деструктор,или
  • function — try-block для функции с возвращаемым типом (возможно, cv-qualified) void

не сталкиваясь с оператором возврата, return; выполняется.

Если управление достигает конца основной функции , return 0; выполнен.

Выход из конца функции, возвращающей значение (кроме main ) без оператора return, является неопределенным поведением.

В функции, возвращающей (возможно, cv-qualified) void , можно использовать оператор return с выражением, если тип выражения (возможно, cv-qualified) void .

Если тип возвращаемого значения функции указан как тип заполнителя , он будет выведен из возвращаемого значения.

Инициализация копии результата вызова функции выполняется до уничтожения всех временных объектов в конце выражения, что, в свою очередь, является sequenced-before уничтожение локальных переменных блока,содержащего оператор возврата.

Возврат по значению может включать в себя создание и копирование / перемещение временного объекта, если только не используется разрешение копирования . В частности, условия копирования / перемещения следующие:

Автоматический переход от локальных переменных и параметров

Выражение move-eligible Если это (возможно, в скобках) id-выражение , которое называет переменную, тип которой.

  • тип энергонезависимого объекта
  • или энергонезависимая ссылка rvalue на тип объекта
Читайте также:
Почему сбились все программы в телевизоре

и эта переменная объявляется.

Информатика. Язык Си: Аргументы функции main(). Центр онлайн-обучения «Фоксфорд»

  • в теле или
  • как параметр

Если выражение подходит для перемещения, выполняется разрешение перегрузки для выбора конструктора, который будет использоваться для инициализации возвращаемого значения, или, для co_return , для выбора перегрузки promise.return_value() (начиная с C++20) . twice :

  • сначала, как если бы выражение было выражением rvalue (таким образом, оно может выбрать конструктор перемещения ), и
  • если первое разрешение перегрузки не удалось или
  • это удалось, но конструктор перемещения не был выбран (формально первый параметр выбранного конструктора не был ссылкой rvalue на (возможно, cv-квалифицированный) тип выражения)
  • затем разрешение перегрузки выполняется, как обычно, с выражением, рассматриваемым как lvalue (поэтому он может выбрать конструктор копирования ).

Если выражение подходит для перемещения, оно обрабатывается как xvalue (таким образом, разрешение перегрузки может выбрать конструктор перемещения ).

Гарантированное устранение копий

Если выражение является значением, результирующий объект инициализируется непосредственно этим выражением. Это не включает конструктор копирования или перемещения, когда типы совпадают (см. Раздел «Разрешение копирования» ).

Keywords

Example

#include #include #include void fa(int i) < if (i == 2) return; std::cout ‘n’; > // подразумеваемый возврат; int fb(int i) < if (i > 4) return 4; std::cout ‘n’; return 2; > std::pairint> fc(const char* p, int x) < return ; > void fd() < return fa(10); // fa (10) — недействительное выражение > int main() < fa(2); // возвращает, ничего не делает, когда i == 2 fa(1); // выводит свой аргумент, затем возвращает int i = fb(5); // возвращает 4 i = fb(i); // выводит свой аргумент, возвращает 2 std::cout ‘n’ fc(«Hello», 7).second ‘n’; fd(); >
1 4 2 7 10

Defect reports

Следующие отчеты о дефектах,изменяющих поведение,были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Поведение в опубликованном виде Correct behavior
CWG 1541 C++98 выражение не может быть опущено, если тип возвращаемого значения имеет значение cv-qualified void его можно опустить
CWG 1579 C++11 возврат путем переоборудования передвижного конструктора не разрешался converting move
включен поиск конструктора
CWG 1885 C++14 последовательность уничтожения автоматических переменных не была явной добавленные правила последовательности
Читайте также:
Программа для беременных по неделям какая лучше

See also

Документация C для оператора return
C++

reinterpret_cast conversion
Преобразование между типами путем переинтерпретации битового паттерна,лежащего в основе.
Требует выражения (начиная с C++20)
Выдает выражение prvalue типа bool,описывающее ограничения.
Правило трех/пяти/ноля

Если класс требует определяемого пользователем деструктора,конструктора копирования,оператора присваивания,то почти наверняка все три.

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

Источник: runebook.dev

При выходе из функции main

Какой будет результат выполнения cout << a::A::a; в функции main ?

Если в функции main() выполняется

. int a=9; // в глобальном пространствеvoid f() < int a; a = 4; >. cout

то что будет выведено?

Если имеется программа

int a = 7; //в глобальном пространствеvoid f()

и в функции main() выполняется

f(); cout

то какой будет результат?

Если имеется программа

int a; //в глобальном пространстве void f()

и в функции main() выполняется

a = 3; f(); cout

то какой будет результат?

Если функция вычисления суммы целых чисел от 1 до n имеет прототип int sum(int n) , запишите определение функции, используя рекурсию:

Если функция вычисления суммы целых чисел от 1 до n имеет прототип int sum(int n) , то как будет выглядеть запись определения функции с использованием рекурсии?

Каково будет значение переменной k после выполнения следующего оператора

k = ++k;

если до его выполнения k равнялось 6 ?

Источник: bazaintuit.ru

Зачем return в программе?

What up, программач.
Т.е, указано, что return — это самый подходящий способ остановить программу.
Вот если указано return 0; — то программа закончиться.Я правильно понимаю?
А если ничего не указать?Она будет в памяти висеть или что?
А если указать 1?
Т.е. если указываешь 0, то это типа false.Можно значит false писать, кому что удобно?
Все никак не могу с этим ретурном разобраться.

  • Вопрос задан более трёх лет назад
  • 32270 просмотров

Комментировать
Решения вопроса 1

Вот если указано return 0; — то программа закончиться.Я правильно понимаю?

Только если это return в main().

return это команда закончить текущую функцию (и вернуть значение вызыающей функции)

А если ничего не указать?Она будет в памяти висеть или что?

С 1998 года она выполнит return 0 (опять же, справедливо только для main() ) как только достигнет конца функции main().

Т.е. если указываешь 0, то это типа false.

Это EXIT_SUCCESS.

Читайте также:
Какое количество Спортивных дисциплин входит в программу соревнований по легкой

А если указать 1?

Implementation defined. Обычно работает так же как и EXIT_FAILURE.

Фактически это код выхода. Он возвращается в ОС. Если программа была запущена из командной строки этот код выхода можно проверить чтобы узнать как была завершена программа.

Ответ написан более трёх лет назад
Нравится 7 1 комментарий

RiseOfDeath

Уточнение — код выхода возвращаетс программе, запустившей прогрумму. (хотя как правило он ею не используется)

Ответы на вопрос 1

main() — это входящая функция. И все же это именно функция, со всеми вытекающими свойствами.
Ее можно обьявить как void, а значит она не должна что либо возвращать и return писать не надо.
Все же многие не понимают по началу, что return, это не только остановка программы, но еще и вывод результата работы функций.
Пример:

//создаем свою собственную функцию, которая что-то делает и что-то возвращает. int myrandom() < int a; a = rand()%100; //генерация случайного числа return a; // возвращаем результат генерации >//а вот наша программка, в которой мы вызовем эту функцию. void main() < int s = myrandom(); // функция myrandom возвращает результат в переменную s. cout
Ответ написан более трёх лет назад
Нравится 1 3 комментария

Если объявить как void, это означает что можно возвращать любой тип данных, включая ничего. Но main должен возвращать код завершения программы, чтобы соответствовать.

Сергей: судя по вопросу, у человека не правильное мнение об return. Тут нужно пояснить сам факт, что return именно возвращает результат работы функции.
А выше люди прицепились к этому main, загоняют ему про «EXIT_SUCCESS», про «Implementation defined», а ему тупо надо пояснить, что функция должна обязана что либо возвращать. А возвращается это именно с помощью return.

Для меня когда-то было большим откровением, что, в некоторой степени, для операционной системы приложение является просто подпрограммой.

Источник: qna.habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru