Rahul Singh Gulia Ответов: 4

Замена номеров с помощью вызова по значению


/* After executing the below program, i am not getting the desired output, as the digits are not getting swapped even after calling the function */

#include<stdio.h>
int swapv(int x, int y);
int main()
{
   int a = 10, b = 20;

   swapv(a,b);
   printf("\na = %d and b = %d", a,b);
   
   return 0;
}

int swapv(int x, int y)
{
   int t;
   
   t = x;
   x = y;
   y = t;

   printf("\n x = %d and y = %d",  x,y);
}

выход :-
x = 20 and y =10
a = 10 and b = 20


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

Что я уже пробовал:

Я могу поменять местами значения, используя метод указателя. Но почему я не могу напрямую поменять значения?

4 Ответов

Рейтинг:
34

Jochen Arndt

Функция вызывается правильно и делает то, что ожидается.

Если вы передаете параметры по значению, то функция работает с этим значением (копией переданной переменной или просто значением с постоянными литералами).

Если вы хотите вернуть измененные результаты вызывающему объекту вы должны передать по ссылке используя указатель для изменения исходных переменных:

void swapv(int *x, int *y)
{
    int t;
    
    t = *x;
    *x = *y;
    *y = t;
    
    printf("\n x = %d and y = %d", *x, *y);
}
В качестве альтернативы вы также можете вернуть результаты с помощью return оператор, когда должно быть возвращено только одно значение (можно вернуть несколько значений, помещая их в структуру, но это довольно редко происходит с C).

Обратите внимание также, что я изменил функцию, чтобы быть void потому что он не возвращает никакого значения.


CPallini

5.

Рейтинг:
22

CPallini

Смотрите, например: Вызов функции по значению в языке C[^].


Рейтинг:
2

KarstenK

в вашем коде функция swapv создает новые и локальные экземпляры из переменных величин.

Одним из возможных решений является использование указателей, но другое-использование ссылочных переменных-немного лучше читается и понятно. Ссылочный оператор использует те же переменные (память), и поэтому операции выполняются с исходными переменными.

void swapv(int& x, int& y)
{
   int t = x;
   x = y;
   y = t;

   printf("\n x = %d and y = %d",  x,y);
}
Функция не должна возвращать значение и поэтому должна быть пуста.

Ваш код вызова остается прежним.
swapv(a,b);


Рейтинг:
14

Patrice T

Цитата:
Замена номеров с помощью вызова по значению

Вот в чем проблема: функция, вызываемая значением, получает значения параметров и понятия не имеет о переменных, содержащих эти значения, или о том, откуда они берутся.
И это законно:
swapv(a, 15+20);

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

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