Почему в ответе получается 0?
потому что j++ - это сначала взять значение (0), использовать его (записать в j), а потом только увеличить
если сделаете for (int i = 0; i < 10; i++) 
    j = ++j;
    // или j = j+1;
    // или j++, получите 10
В разжеванном варианте понятно все, кроме последней части, зачем j = z ?
Затем, что так определён оператор постфиксного инкремента. Скопировать значение переменной. Увеличить переменную. Вернуть скопированное значение. Этим копированием постфиксный инкремент(ш++) отличается от префиксного(++ш).
Присвоение выполняется в самом конце, поскольку имеет меньший приоритет.