#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();
wherefunc()
также возвращает avoid
).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; }