Функция C не является «функцией», как в математике (или как в функциональном программировании).
Это просто последовательность действий, необходимых для получения возвращаемого значения, и это означает, что функция может получить побочные эффекты.
Так что подумайте над своим примером - что если foo () будет выглядеть так:
int foo()
{
printf("some text");
return 10;
}
Другими словами, если вы используете переменную с возвращаемым значением - вы просто используете значение, но если вы используете вызов функции, вы делаете все вычисления, необходимые для получения значения.