# Understanding procedure in C++

I have the following code in C++:

``````#include <iostream>
using namespace std;

int x;

void p(int a, int &b) {
cout << x << " " << a << " " << b << endl;
if (a < b) {
a = x+b;
}
else {
--x;
b += a;
a = x/2;
cout << x << " " << a << " " << b << endl;
p(b-x, a);
}
cout << x << " " << a << " " << b << endl;
}

int main() {
x = 17;
p(42, x);
cout << x << endl;
}
``````

The output of this code is the following, which I don’t understand:

``````17 42 17
58 29 58
58 0 29
58 87 29
58 29 58
58
``````

Specifically, in `main`, `x=17` assigns a global parameter. It starts calculating `p(a=42,&b=17)`. It prints out: `x = 17 (global),a = 42 ,b = 17 (pointer)`. Good so far!

Next, it goes to `if`. `if 42<17` is not satisfied and goes to `else`, in which `x` is decremented by one so `x=17-1=16`. Not 58.

What is going on? Can someone please explain?

### >Solution :

Your parameter `b` is a reference (ie, alias) to an `int` variable. In this case, it refers to the global variable `x`, since that is what `main()` is passing in. So, `x` and `b` are separate names for the same memory block that is holding an `int` value. As such, anything you do to `x` is reflected in `b` and vice versa.

When your code goes to the `else` for the 1st time, the value of `x` (and thus `b`) is 17. You decrement `x` (and thus `b`) by 1, and then increment `b` (and thus `x`) by `a` (42). So, you are actually incrementing `x` by 41, hence why `x` becomes 58 (17-1+42=58).