Когда функция должна возвращать что? - PullRequest
0 голосов
/ 14 февраля 2019

Я немного озадачен типом возвращаемой функции, особенно когда возвращать что.Если у нас есть какая-либо произвольная функция, скажем, min (x, y), которая должна возвращать в соответствии с инструкциями if, что я должен возвращать вне их области видимости, что требуется в объявлении функции.Я узнал, что обычно используют «return 0» или «return 1», но я не понимаю, почему это так, и почему он не может просто вернуть ни один из операторов возврата if.

// compute difference largest - smallest
int   diff(x, y)
{
   if (x > y)
    return x - y;
   if (y > x)
    return y - x;
   if (x == y)
    return 0;
   return 1;
}

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

Для функции, которая вычисляет разницу между двумя значениями, вы вернете 1, только если разница между этими двумя значениями будет 1, 0, если они равны.

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

int diff( int x, int y );
{
  int delta = 0;

  if ( x >= y )
    delta = x - y;
  else 
    delta = y - x;

  return delta;
}

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

0 голосов
/ 14 февраля 2019

Тип возврата функции указан в определении, int в вашем случае.На самом деле вам нужно указать тип входных аргументов (x, y), а затем тип вывода обычно определяется на основе их типа - например, 2/3 случаев в вашей функции, а последний - целочисленный (0).

Примечание: Вам также нужно выбрать более подходящее название для функции.

0 голосов
/ 14 февраля 2019

Компилятор должен убедиться, что вы что-то возвращаете.Если у вас есть возврат внутри операторов if, как у вас, как компилятор скажет, покрыли ли вы все случаи?

Даже если вы сделаете что-то вроде кода ниже, как компилятор собираетсязнаете, что вы вернетесь при любых обстоятельствах?Из-за этого этот код выдаст ошибку:

int min(int x, int y)
{
    if (x > y)
        return x - y;
    if (y > x)
        return y - x;
    if (x==y)
        return 1;
}

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

Однако есть лучшие способы убедиться, что вы всегда будете возвращать значение.Например, вы можете использовать оператор else как универсальный метод:

int min(int x, int y)
{
    if (x > y)
        return x - y;
    if (y > x)
        return y - x;
    else
        return 1;
}

Поскольку else гарантированно перехватывает все случаи, компилятор рад этому и не выдаст никаких ошибок.

0 голосов
/ 14 февраля 2019
  • Если X больше Y, вернуть X-Y (очевидно)
  • Если Y больше X, вернуть Y-X (также очевидно)
  • Если X и Y равны равны , что, по вашему мнению, должно быть возвращено?
    Если они равны, то X-Y и Y-X равны 0, так что это не имеет значения, не так ли?

Ваше последнее предложение может быть написано любым из:

return x-y;
return y-x;
return 0; 

Поскольку эти два значения равны, они ВСЕ оценятся в 0.

Важной частью является обеспечение сохранения контракта функции..
Согласно комментариям, функция утверждает, что вернет разницу между двумя значениями.Таким образом, он должен возвращать разницу во всех случаях , независимо от того, является ли большее значение X, Y или они равны.

Название вашей функции вводит в заблуждение,Поскольку он называется min, это означает, что он вернет значение минимум , а не разницу.Вы должны изменить имя функции на что-то вроде diff или delta для ясности.


В конечном счете, более простой способ написать функцию:

// compute largest - smallest
int diff(int x, int y)
{
   if (x > y)
    return x - y;   // Handles X is bigger than Y
   else
    return y - x;   // Handles Y bigger than X, *or* X and Y are the same.
}

Наконец, несколько очень коротких версий, которые я бы рассмотрел лучше.

int diff(int x, int y) { return x>y? x-y:y-x; }
int diff(int x, int y) { return abs(x-y);     }
...