Вы передаете значение x + y в функцию doSomething (). Это означает, что в стеке функций doSomething () будет иметь доступ к одной локальной переменной j, значение которой установлено из функции под ней в стеке в любое значение x + y (то есть функцию, которая их вызвала). Поскольку эта переменная полностью отделена от родительской функции, изменение ее значения не повлияет на переменные, расположенные ниже в стеке.
Если, однако, вы хотите, чтобы j была точно такой же переменной, как в родительской функции, вы можете сделать что-то вроде:
void doSomething( double& j )
{
double x = j - 1;
double y = j - 2;
double willChange = x + y;
doSomething( willChange );
x = j + 31;
y = j + 12 ;
}
Обратите внимание на & после двойного, это говорит компилятору, что функция принимает значение двойного по своему адресу, который вызывается достаточно соответствующим образом, передавая по адресу. Здесь в дочернем элементе каждого doSomething () j - псевдоним для переменной willChange в функции под ней в стеке.
Если вы хотите изменить x и y специально, тогда, возможно, сделайте что-то вроде
void doSomething( double& x, double& y )
{
double j = x + y
double x = j - 1;
double y = j - 2;
doSomething( x, y );
x = j + 31;
y = j + 12 ;
}