В 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.