Полезность возвращаемого значения вне зависимости от всех (исключительно по значению) параметров - PullRequest
0 голосов
/ 17 мая 2018

У меня один вопрос:

int swapnum( int x, int y )
{
   int tempnum ;
   tempnum = x ;
   x = y ;
   y = tempnum ;
   return tempnum;

}
int swapnum(int, int);
int main( )
{
    int x = 35, y = 45 ;
    printf("Before swapping: %d, %d", x, y);
    swapnum(x, y);
    printf("\nAfter swapping: %d, %d", x, y);
    return 0;
}

Я нашел этот пример в интернете, который демонстрирует, как работает вызов по значению. Я все понимаю, кроме одного. Для чего нам нужен вызов по значению, если мы не получим измененный результат в main? Я понял идею звонка по ссылке; мы получим измененный результат, но для чего нам нужен вызов по значению, если результат изменяется только локально (в верхней части этого кода), а main остается неизменным (printf("\nAfter swapping: %d, %d", x, y);)? И если вы напишите свой пример, чтобы продемонстрировать, что это было бы здорово.

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Я нашел этот пример в интернете, который демонстрирует, как работает вызов по значению.Я понимаю все, кроме одного: для чего нам нужен вызов по значению?

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

Я понял идею вызова по ссылке, мы получим измененный результат, но длячто нам нужно вызывать по значению, если результат изменяется только локально

Вызов по значению используется в большинстве языков программирования, потому что это облегчает понимание кода.Когда вы видите doStuff(x, y);, вы знаете, что x и y не изменятся.Они могут измениться, только если вы напишите doStuff(&x, &y); или x = doStuff(y); или что-то в этом роде.Вам не нужно искать справочник DoStuff, чтобы узнать, должен ли doStuff их изменить.

и если вы напишите свой пример, чтобы продемонстрировать, что это было бы здорово.

Там действительно нечего демонстрировать;смысл вызова по значению в том, что ничего не происходит.Вы хотите, чтобы демонстрация ничего не происходила?

0 голосов
/ 17 мая 2018

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

0 голосов
/ 17 мая 2018

Есть даже функции, которые ничего не возвращают. У них есть прототип, как

void useTwoNums(int, int);

Они иллюстрируют даже лучше, чем ваш пример, что не нужно ничего возвращать, даже меньше того, что каким-то образом использует два входных параметра и / или зависит от них.

Концепция, которую вы, похоже, упускаете, - это различие между «функциями» в математическом контексте и «функциями» в программировании. При программировании функция вполне может делать что-то, не возвращая что-либо. Одним из примеров является функция, которая просто красиво печатает входные значения, сравни printf(),
http://en.cppreference.com/w/c/io/fprintf Его возвращаемое значение может быть обработано внутри функции без возвращаемого значения для иллюстрации.

В крайнем случае будет функция без параметров и возвращаемого значения:
void DoSomethingInFreespace(void);. Подобные функции позволяют получить данные для обработки, например, через другие входные каналы. Или это просто переработанные фрагменты кода, например для повторного использования, которые имеют достаточно богатый контекст, например глобальные или файловые локальные переменные.

Чтобы сделать ответ более полным, я объединю некоторые моменты из комментариев (в том числе от OP, который фокусируется на возвращаемых значениях): Функции вызова по значению более близки к математическим функциям, и тогда их гораздо проще составить. (Жан-Батист Юнэс). а также позволяет отправлять значения, не беспокоясь о том, что какая-то функция изменит их. Это очень удобно. (njzk2) Оба (и другие тоже) подчеркивают, что математическая функция не изменяет параметры; это что-то вроде «обещания», которое ценят программисты.

Поворот вокруг: при использовании вызова по значению, если вы хотите, чтобы [значение в контексте вне функции, например] main, было изменено, мы должны вернуть результат (OP)

Другой угол:
при использовании вызова по ссылке нам не нужно возвращаться; он [параметр] сам изменяет [вне контекста вызываемой функции и может использоваться как] результат (OP)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...