Создание функции void, которая возвращает значение

#c

#c

Вопрос:

Меня попросили создать функцию void, которая возвращает значение. Например, если у нас есть что-то вроде:

 int add(int n, int k){
   return n k; 
}
  

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

 void add(int n, int k){
   //returning the sum of n and k in a void function
}
  

Или это невозможно, как я сначала подумал?

Комментарии:

1. Вопрос не имеет смысла в том виде, в каком он был задан. Каков был контекст? Это была реальная проблема или вопрос-головоломка / интервью? В последнем случае можно было бы использовать обратный вызов, но он не возвращает значение. Поскольку это C (следовательно, язык OO), он также может передавать результат вперед, следуя идиоме Tell Don»t Ask. martinfowler.com/bliki/TellDontAsk.html

2. Да, это было последнее! Спасибо вам за это, я просмотрю это.

Ответ №1:

Используйте выходной параметр, например:

 void add(int n, int k, int amp;result) {
   result = n k;
}

...

int sum;
add(1, 2, sum);
// use sum as needed...
  

Или:

 void add(int n, int k, int *result) {
   *result = n k;
}

...

int sum;
add(1, 2, amp;sum);
// use sum as needed...
  

Комментарии:

1. Извините, если я спрашиваю что-то глупое, но как она возвращает здесь результат ? Разве она не хранит только сумму в этой ссылочной переменной, но все равно ничего не возвращает?

2. @Reformed это правильно. Сумма сохраняется в отдельной переменной, предоставляемой вызывающим объектом. void Функция никоим образом не может возвращать что-либо иное, кроме void (т.е. return void(); это допустимый оператор, так как return func(); where func() также возвращает a void ).

3. Я понимаю, и теперь мы можем использовать эту переменную, создавая что-то вроде псевдовыхода.

4. @Reformed Это чаще называется ссылкой.

Ответ №2:

void Функция по определению не может возвращать значение. Вот что void означает в данном контексте.

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

  • Она может принимать аргумент указателя
  • Она может принимать ссылочный аргумент
  • Она может присваивать значение глобальной переменной (или любому объекту, видимому вызывающей стороне)

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

Комментарии:

1. @Reformed определение возвращаемого типа as void в целом нормально, просто не тогда, когда вы действительно хотите return ввести значение. Используйте void всякий раз, когда вы НЕ хотите return вводить значение.

2. @RemyLebeau Да, конечно. Могу я также спросить, как должна была быть записана функция в регистре указателей? Я попробовал это: void add(int n, int k, int * result) { результат = n k; } … int sum; add(1, 2, amp;sum); Но это не работает.

3. @Reformed Вам нужно разыменовать указатель, чтобы присвоить значение переменной, на которую он указывает: void add(int n, int k, int *result) { *result = n k; }