fk0, легенда (09.11.2017 23:53, просмотров: 324) ответил Petrovich на Да я думал неинтересно народу... Надеюсь, вы поняли откуда появляется ошибка. Это, оказывается, всего лишь ошибка наблюдателя. Выход - проверять в обратной поледовательности чем инкремент, т.е. if(tail>head) {out ERROR;} и будет хорошо.
В выражении tail > head последовательность чтения переменных в общем случае не совсем определена, если они не volatile (для последних порядок сохраняется, но только относительно самих этих переменных, а не других переменных, памяти адресуемой по указателю и т.п.) Да, порядок слева направо, и если бы там функции были -- так бы и вызывались. Но когда компилятор получил, условно, ассемблерный код он может начать его оптимизировать и переставлять инструкции в коде функции. Компилятор может заранее в прологе функции в регистры набрать переменные с которыми будет работать, так код меньше/проще/лучше. И набрать в другом порядке. Если здесь все volatile, то вообще не вижу проблему.
[ZX]