Namespaces
Variants

return statement

From cppreference.net

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

Содержание

Синтаксис

attr-spec-seq (необязательно) return expression ; (1)
attr-spec-seq (необязательно) return ; (2)
expression - выражение, используемое для инициализации возвращаемого значения функции
attr-spec-seq - (C23) опциональный список атрибутов , применяемых к оператору return

Объяснение

1) Вычисляет выражение , завершает текущую функцию и возвращает результат выражения вызывающей стороне (возвращаемое значение становится значением выражения вызова функции). Действительно только в случае, если тип возвращаемого значения функции не является void .
2) Завершает текущую функцию. Действительно только в случае, если тип возвращаемого значения функции void .

Если тип выражения отличается от возвращаемого типа функции, его значение преобразуется как если бы присваиванием объекту, тип которого является возвращаемым типом функции, за исключением того, что допускается перекрытие объектных представлений:

struct s { double i; } f(void); // функция, возвращающая struct s
union { struct { int f1; struct s f2; } u1;
        struct { struct s f3; int f4; } u2; } g;
struct s f(void)
{
    return g.u1.f2;
}
int main(void)
{
// g.u2.f3 = g.u1.f2; // неопределённое поведение (перекрытие при присваивании)
   g.u2.f3 = f();     // корректно определено
}

Если возвращаемый тип является вещественным плавающим типом, результат может быть представлен с большим диапазоном и точностью , чем подразумевается новым типом.

Достижение конца функции, возвращающей void , эквивалентно return ; . Достижение конца любой другой функции, возвращающей значение, является неопределённым поведением, если результат функции используется в выражении (разрешено отбрасывать такое возвращаемое значение). Для main см. main function .

Выполнение оператора return в no-return функции является неопределённым поведением.

(since C11)

Ключевые слова

return

Пример

#include <stdio.h>
void fa(int i)
{
    if (i == 2)
       return;
    printf("fa():   %d\n", i);
} // implied return;
int fb(int i)
{
    if (i > 4)
       return 4;
    printf("fb():   %d\n", i);
    return 2;
}
int main(void)
{
    fa(2);
    fa(1);
    int i = fb(5);   // the return value 4 used to initializes i
    i = fb(i);       // the return value 2 used as rhs of assignment
    printf("main(): %d\n", i);
}

Вывод:

fa():   1
fb():   4
main(): 2

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 6.8.6.4 Оператор return (стр. 111-112)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 6.8.6.4 Оператор return (стр. 154)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 6.8.6.4 Оператор return (стр. 139)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 3.6.6.4 Оператор return

Смотрите также

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