С
w = b[out];
Вы берете только копию предмета, который нужно использовать. С
out = (out + 1) % n;
Вы повышаете индекс предмета, который будет потребляться, тем самым предотвращая повторную ссылку на него.
В некотором смысле, несколько вызовов w = b[out];
на самом деле не занимают слот буфера, он просто обращается к нему; в то время как out = (out + 1) % n;
предотвращает дальнейший доступ к этому предмету. Предотвращение дальнейшего доступа к элементу буфера - самое сильное определение термина «потреблять элемент», о котором я только могу подумать.