factorial(i) = (factorial(i - 1) * i);
Эта строка недопустима с точки зрения C стандарта. Он связан с определением lvalue
и rvalue
.
lvalue
- это выражение, относящееся к объекту. Имя 'lvalue' происходит из выражения присваивания E1 = E2
, в котором левый операнд E1
должно быть выражением lvalue
.
rvalue
- это выражение, которое не является lvalue
(я не могу найти его точное определение). Другими словами, rvalue
нельзя переназначить.
Пример:
int n;
...
n = 3; // --> Legal, n is an lvalue and 3 is an rvalue
3 = n; // --> illegal, 3 is rvalue and thus n cannot be assigned to it
Другой пример
int a, b, c;
...
a = b + c; // --> Legal since 'a' is an lvalue (refers to an object/memory)
/* Note that 'b' is also lvalue, 'c' is also lvalue BUT 'b + c' is an rvalue expression! */
/* the temporal storage allocated for the result of the expression 'b + c' cannot be "visible" */
/* one cannot check the address of such expression: &(a + b) ==> illegal */
b + c = a; // --> Illegal
В вашем примере factorial(i)
представляет возвращаемое значение функции, которое является rvalue
.
Для более подробной информации: https://www.embedded.com/lvalues-and-rvalues/