В чем разница между использованием / не использованием возврата в подпрограмме? - PullRequest
0 голосов
/ 27 апреля 2020

Второй фрагмент кода не дает правильное значение, поскольку он только передает значение r из того, что я вижу. Тем не менее, я хотел бы, чтобы этот код работал без использования return (просто для изучения, как сделать это другим способом). Кроме того, что считается лучшей практикой между этими двумя вариантами? Спасибо! : -)

#include <stdio.h>

#define PI 3.1416

float area(float r);

int main(void)
{
  float r = 10;
  printf("Area: %.2f", area(r));
  return 0;
}

float area(float r) {
    return PI * r * r;
}
#include <stdio.h>

#define PI 3.1416

float area(float r);

int main(void)
{
  float r = 10;
  printf("Area: %.2f", area(r));
  return 0;
}

float area(float r) {
    PI * r * r;
}

1 Ответ

3 голосов
/ 27 апреля 2020

Я бы хотел, чтобы этот код работал без использования return (просто для изучения того, как это сделать другим способом).

Использование return - единственный способ на самом деле вернуть значение из функции.


Однако синтаксис C предоставляет две альтернативные опции:

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

Например:

#include <stdio.h>

#define PI 3.1416

void area(float r, float *p);

int main(void)
{
  float r = 10;
  float s;
  area(r, &s);
  printf("Area: %.2f", s);
  return 0;
}

void area(float r, float* p) {
   *p = PI * r * r;
   return;
}

Также возможно определить глобальный объект и назначить вместо него значение выражения этому глобальному объекту.

Например:

#include <stdio.h>

#define PI 3.1416

float s;

void area(float r);

int main(void)
{
  float r = 10;
  area(r);
  printf("Area: %.2f", s);
  return 0;
}

void area(float r) {
    s = PI * r * r;
    return;
}

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

По возможности следует избегать использования глобальных объектов, хотя бывают случаи, когда Глобальные объекты подходят, если вы используете объект в нескольких функциях и роль объекта точно определена. Но в предоставленном вами примере глобальный объект не очень хорошо подходит и его следует избегать.


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

...