Chamar por referência, valor e nome

Estou tentando entender a diferença conceitual entre chamada por referência, valor e nome.

Então eu tenho o seguinte pseudocódigo:

foo(a, b, c)
{
   b =b++;
   a = a++;
   c = a + b*10
}

X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);

O que é X, Y e Z após a chamada foo se a, b e c forem todos chamados por referência? se a, bec são chamados por valor / resultado? se a, bec são chamados pelo nome?

Outro cenário:

X=1;
Y=2;
Z=3;
foo(X, Y+2, X);

Estou tentando começar a estudar para a próxima final e isso parece um bom problema de revisão. O pass-by-name é definitivamente o mais estranho para mim.

questionAnswers(5)

yourAnswerToTheQuestion