К чему относятся возвращать стоимость или не возвращать это в функциях?

Я знаю, что существуют функции void и return, но я не знаю, к чему они относятся несмотря на то, что возвращают или нет, начинаюсь в программировании и он в языке C.

6
задан 05.10.2016, 15:53
3 ответа

Когда ты ponés void в функцию определяешь, что не будет возвращать никакой стоимости (или же, он ничего не возвращает).

Он используется, когда querés, выполнять серию действий, но не querés приносить результат всех этих действий, а они просто будут работать.

Например, печатать текст:

public void hacerAlgo(){
  printf("Imprimiendo algo");
}

Взамен, если querés, что функция возвратила какую-то стоимость, показывается тип. Например, один int, один char, и т.д.

То, что служит тебе этим, что если tenés функция, которую он возвращает тебе стоимость, ты podés позже сохранять эта стоимость в переменной и продолжать действовать с этим результатом, или перемещать его стоимость, возвращенную функции.

Пример, чтобы складывать 2 параметра, перешедших в функцию:

public int suma(int a,int b){
  return a+b
}
6
ответ дан 24.11.2019, 13:14
  • 1
    Действительно printf s и # 237; что возвращает стоимость: количество символов, которые смогли писаться (или отрицательная стоимость в случае ошибки)... другая вещь - что самая большая большая и # 237; в случаев Ваша стоимость возврата была проигнорирована, но s и # 237; что возвращает что-то;) – PaperBirdMaster 05.10.2016, 10:05

"К чему относятся возвращать стоимость или не возвращать это в функциях?" Буквально чтобы возвращать стоимость или нет. Функция реализует серию операций, если как результат этой серии операций получается стоимость, может быть полезно возвращать это (p.e. для того, чтобы он смог быть использованным другой функцией как параметр ввода).

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

int sumar(int a, int b) {
    int c = a + b;
    return c;
}

Но у не всех функций есть, почему возвращать стоимость, могут быть функции, что единственное, что они делают, состояло в том, чтобы реализовывать операции, но не надо ничего не возвращать, в этом случае он, когда они будут void и они не используют return. Например, показывать сообщение успеха / ошибки, если ключ, использованный, чтобы открывать дверь, - правильный:

void abrirPuerta(llave) {
   if (llave == "correcta") {
       mostrarMensajeExito();
   } else {
       mostrarMensajeError();
   }
}

В других языках делается более ясная дифференциация между функциями, которые возвращают стоимость и тех, кто это не возвращают. Например, на языке программирования Паскаль, их называются функции, в которые они возвращают стоимость и процедуры, в которые нет.

3
ответ дан 24.11.2019, 13:14

К чему относятся возвращать стоимость или не возвращать это в функциях?

Просто, в который функция может, или не возвращать стоимость; но внутри этого простого ответа есть несколько комплексности, которую нужно иметь в виду.

Тип возврата функции.

Стоимость, возвращенная функцией приходит определенный типом, показанным перед функцией:

tipo_retorno funcion(parametro/s);
____________

tipo_retorno смоги быть любой из следующих:

  • void: тип специального возврата, который он показывает, что нет возврата. Void значит пустоту на английском (видеть второе значение).
  • Фундаментальные типы: любой из типов proveídos из-за языка (short, unsigned, double, ...);
  • Типы, определенные пользователем: Любой тип, определенный пользователем.

Возвращать стоимость позволяет использование как выражение.

Функция, которая возвращала бы стоимость, а именно: тип которого возврата не был void, смоги быть использованным в выражениях:

int uno() { return 1; }
int dos() { return 2; }
void nada() {}

// Funciones en una expresion
int cinco = dos() + dos() + uno();
// Funciones en una expresion con literales
int once = (cinco * dos()) + uno();
// Funciones en una condicion
if ((uno() + dos()) == 3) printf("Las matematicas no fallan\n");

В этих выражениях, функции оценены во-первых и после оценивается выражение, которого они составляют часть. Так что выражения могли бы быть похожими в:

int cinco = 2 + 2 + 1;
int once = (cinco * 2) + 1;
if ((1 + 2) == 3) printf("Las matematicas no fallan\n");

Но функция, которая не возвращала бы стоимость, а именно: тип которого возврата БЫЛ void, Не моги быть использованным в выражениях:

/* Error, una funcion que no devuelve nada
   no puede formar parte de una expresion. */
int uno_mas_nada = uno() + nada();
int dos_por_nada = dos() * nada();
/* Error, una funcion que no devuelve nada
   no es comparable con nada. */
if (nada()) printf("K'thulu ascendera!");

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

int uno_mas_nada = uno() + ;
int dos_por_nada = dos() * ;
if ( ) printf("K'thulu ascendera!");

Этому не удается случиться, потому что составитель считает, что функция без возврата в выражении - ошибка, так что даже он не оценивает ее.

Используя return плохо.

Инструкция return это та, которая распределяет стоимость возврата в функции, тип которых возврата не был void, так что если return он сопровожден выражением или стоимость будет, чтобы использовать вышеупомянутое выражение или стоимость как стоимость, возвращенную функцией; если return он сопровожден выражением или стоимость понимает, что он возвращает void (пустота). И действительно так это определяет стандарт C в секции §6.8.6.4 La instrucción return (перевод мой):

6.8.6.4 Инструкция return

Ограничения

  1. Инструкция return с выражением не будь должен появляться в функции, тип которой возврата был void. Инструкция return без выражения будь должен появляться только в функциях, тип которых возврата был void.

Согласно стандарту C эти функции не выполняют ограничения:

// No devuelve nada, pero deberia devolver un numero.
int funcion_int() { printf("Patatas fritas con ketchup y mayonesa, que rico!"); };

// A veces devuelve algo y a veces no.
int funcion_intint(int n)
{
    if (n==4) return 0;
}

// Usa un return vacio, pero no deberia!
int funcion_return_vacio() { return; }

// Se supone que no devuelve nada, pero igualmente lo hace!
void funcion_void() { return 0; }

Но составитель только выражает тревоги по этому поводу:

In function 'funcion_return_vacio':
warning: 'return' with no value, in function returning non-void [enabled by default]
 int funcion_return_vacio() { return; }
                              ^
In function 'funcion_void':
warning: 'return' with a value, in function returning void [enabled by default]
 void funcion_void() { return 0; }
                       ^
In function 'funcion_int':
warning: control reaches end of non-void function [-Wreturn-type]
 int funcion_int() { printf("Patatas fritas con ketchup y mayonesa, que rico!"); };
 ^
In function 'funcion_intint':
warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

И функции функционируют после того, как - вызовы:

printf("%d\n", funcion_int());
printf("%d\n", funcion_intint(4));
printf("%d\n", funcion_intint(5));

Производя следующий вывод:

Patatas fritas con ketchup y mayonesa, que rico!48
0
0

Удивительное - что вызов в funcion_int он возвратил стоимость 48 несмотря на то, что нет никакой return в вышеупомянутой функции. То, за чем оно последовало, состоит в том, что функция использует стоимость, возвращенную из-за printf как стоимость, которую нужно возвращать. Но два вызова в funcion_intint они возвратили 0 несмотря на то, что он только был бы должен возвращать эту стоимость, будучи названа нечетным числом...: что происходит?

Мы встретились с неопределенным поведением, которое показано в стандарте C в секции §6.9.1 Definiciones de funciones (перевод мой):

6.9.1 Определения функций

  1. Если его достигают } что заканчивает функцию и стоимость призыва к функции использована llamante, поведение неопределенное.

В случаях funcion_int() и funcion_intint(4) поведение неопределенное, так как он подошел близко в конце функции вместо того, чтобы выходить из функции через инструкцию return, когда оно последует за неопределенным поведением, смоги перемещать любую вещь: что код функционировал, что возвратили себе неожиданную стоимость, или что вышли выстрелившие демоны твоих носовых полостей.

Исключение в правило... main.

Согласно стандарту C, только существует функция, в которой еще требуя стоимости возврата инструкция return он опциональный. Это функция main, что, поскольку он устанавливает секцию §5.1.2.2.3 Finalización del programa (мои перевод и выделенный звук):

5.1.2.2.3 Окончание программы

  1. Если тип возврата функции main это совместимый тип с int, возврат так называемого инициала в функцию main это эквивалент, который нужно призывать к функции exit со стоимостью, возвращенной функцией main как я доказываю; достигать } что заканчивает функцию main возврати стоимость 0. Если тип возврата не совместим с int, статус, возвращенный вызывающему неопределен.

Так что существует случай, в котором определено правильно, что сделало, когда функция, которая была должна возвращать стоимость, это не возвращает, специфическое исключение для main.

1
ответ дан 24.11.2019, 13:14