Передача выражения в качестве параметра в Call по ссылке - PullRequest
0 голосов
/ 12 июня 2010

All

Когда мы передаем выражение в качестве параметра, как происходит оценка? Вот небольшой пример. Это просто пример псевдокода :

f (x,y)
{
    y = y+1;
    x = x+y;
}
main()
{
    a = 2; b = 2;
    f(a+b, a)
    print a;
}

При доступе к переменной x в f, получает ли он доступ к адресу временной переменной, которая содержит результат a+b, или он будет обращаться к отдельным адресам a и b, а затем оценивать значение a+b

Пожалуйста, помогите.

С уважением, darkie15

Ответы [ 2 ]

1 голос
/ 30 мая 2011

В C или C ++, если x и y не являются указателями (в любом случае выражение в любом случае бесполезно), они оба вычисляются перед тем, как вызов функции и VALUE результата помещаются в стек. Нет никаких ссылок вообще.

Все параметры в C и C ++ всегда передаются по значению. Если в функцию передается ссылочный тип (например, int *, int &), передается VALUE ссылки. Несмотря на то, что ссылочный объект может быть изменен путем доступа, например, к * * в функции, значение ссылки все равно не может быть изменено, поскольку параметры C и C ++ всегда всегда передаются только по значению.

РЕДАКТИРОВАТЬ: исключение в C и C ++ - это случай, когда некоторый перегруженный оператор определен следующим образом:

T* operator+ (L lhs, R rhs) {return new T(lhs, rhs);}

и x - это L, а y - это R. В этом случае значение T *, сгенерированное функцией, помещается в стек в качестве параметра. Не пишите такой код, это сбивает с толку других программистов = D.

1 голос
/ 12 июня 2010

Отчасти зависит от языка, но в C ++

f(a+b, a)

оценивает a + b и помещает результат оценки в стек, а затем передает ссылки на это значение в f (). Это будет работать только в том случае, если первый параметр имеет тип f () и является константной ссылкой, поскольку временные объекты, такие как результат a + b, могут быть связаны только с константными ссылками.

...