1)Присваивание и возврат значения - разные вещи.
Присваивание - это присваивания переменной значения, возвращаемого выражениям справа от =.
Т. е., есть выражение, которое возвращает значение в результате вычисления этого самого выражения. Например, (a+b+c)/d.К сожалению, выражение может не только возвращать значение, но и изменять значение переменных, которые в нем участвуют. Как, например i++ и ++i. Но это плохой стиль кодирования (мое личное мнение). Return - это уже не тот возврат значения, о котором шла речь выше. Это оператор который указывает, какое значение будет результатом выполнения функции. Просто когда написано return 0; то это называют возвратом значения функции.
2) Хрень, читаем ответ на п. 1
3) Возврат значения выражением может производится в никуда. Например, просто написано i++. Но если этот пример имеет смысл, то, если просто написать a+b, то хоть так и можно, смысла никакого нет.