Каковы результаты этой программы на С ++? - PullRequest
0 голосов
/ 14 марта 2020

я наткнулся на программу на c ++ для печати значений px и py. Было бы хорошо, если бы кто-то объяснил мне, как можно получить выходные значения как 20 и 8. Кроме того, когда кто-то комментирует строку кода location(px,py), вывод кода будет 10 и 8. Когда кто-то комментирует строку код location(py), результат кода 14 и 2. Я знаю, что как & x = px, т. е. x ссылается на px, когда x изменяется, px также изменяется. Но я не понимаю выводимых значений. Был бы признателен, если бы кто-то объяснил мне.

#include <iostream>
using namespace std;

void location(int &x, int y=4)
{
    y+=2;
    x+=y;
}
int main() {
    int px=10,py=2;
    location(py);
    location(px,py);
    cout << px << py;
    return 0;
}

Ответы [ 3 ]

2 голосов
/ 14 марта 2020

Программа:

#include <iostream>
using namespace std;

void location(int &x, int y=4)
{
    y+=2;
    x+=y;
}

int main() 
{
    int px=10,py=2;
    location(py);
    location(px,py);
    cout << px<<" "<< py;
    return 0;
}

Вывод:

20 8
Process returned 0 (0x0)   execution time : 0.312 s
Press any key to continue.

1) как получить выходные значения как 20 и 8.

    location(py); //y+=2; is 6                ------  1
                  //py+=y; is 8

после этой строки py содержит 8.

    location(px,py);  //y+=2; is 10           ------- 2
                      //px+=y; is 20

после этой строки px содержит 20;

, поэтому, вывод равен 20 8

2 ) когда кто-то комментирует строку кода (px, py)

Когда вы комментируете location(px,py); это. Выполняется только (1), поэтому значение py изменяется на 8, а значение px остается неизменным

, поэтому вывод равен 10 8

3) Когда кто-то комментирует строку расположения кода (py )

, когда вы комментируете location(py) это. (1) не выполнено, поэтому значение py остается неизменным. Значение, переданное ему, равно location(px,py), равно 10 и 2

здесь

     y+=2;  //y=4
     px+=y; //px is 14 

, поэтому вывод равен 14 2

Примечание: void location(int &x, int y=4), x не является локальной переменной, это ссылка на переданное значение, поэтому изменение x в функции также отражается в фактическом значении.

2 голосов
/ 14 марта 2020

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

Когда вызывается location(py), py изменяется, так как он передается по ссылке.

y += 2 // y = 6
py += y // py += 6 => py = 8

Когда вызывается location(px, py), изменится только px, поскольку py является передачей по значению.

y += 2 // y = 10, since py = 8
px += y // px += 10 => px = 20

Теперь, если вы комментарий location(px, py) px = 10 остается неизменным, в то время как py был изменен на 8, следовательно, вывод.

Если вы комментируете location(py), обратите внимание, что py все еще (и останется) равно 2. Таким образом:

y += 2 // y = 4, since py = 4
px += y // px += 4 => px = 14
0 голосов
/ 14 марта 2020

Во-первых, пусть будет известно, что способ написания «программы» имеет очень мало смысла в реальном мире (для меня) и что он таит в себе много запаха кода.

Как говорится, это вот что происходит:

Свободная функция location() принимает два параметра, x и y, оба имеют тип int, x передается по ссылке, y передается по ценность. Кроме того, y является необязательным параметром, который по умолчанию равен 4, если вызывающий не передал иное.

Когда вы вызываете location(px, py) в области вызова, x является указателем на местоположение в память, в которой хранится значение, присвоенное px в области вызова. Если значение в этой ячейке памяти изменяется в пределах тела location, оно также изменяется на px в области вызова. Когда вы вызываете location(px, py) в области вызова, y является копией значения , назначенного для py в новой ячейке памяти (в стеке). Когда значение y изменяется в теле location s, значение py (в другом месте памяти) в области вызова остается неизменным. В этом конце тела location, y выходит из области видимости, и занимаемая им память освобождается из стека.

Если вы понимаете разницу между передачей по значению и передачей по ссылке и понимаете, что operator += делает, выходные значения должны иметь смысл для вас.

...