Стандарт - по ссылке -> http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf Если в двух словах, то компилятор обязан загрузить/сохранить все volatile-переменные в контрольных точках (sequence points). Эти точки возникают в разных местах, в том числе там, где стоит ";" (end of expression statement).