В стандарте C99 про volatile написано чуть побольше, на самом деле.
И там тумана напущено, причём, скорее всего, намеренно. Но для нас,
мк-водов, смысл именно такой: компилятор обязан сохранять операции
чтения и записи volatile-объектов, а также их порядок, в
соответствии с правилами "абстрактной машины" (тот самый "запрет на
оптимизацию").