Namespaces
Variants

As-if rule

From cppreference.net

Позволяет любые и все преобразования кода, которые не изменяют наблюдаемое поведение программы.

Объяснение

Компилятору C разрешено вносить любые изменения в программу при условии, что следующее остается верным:

1) В каждой точке следования значения всех volatile объектов стабильны (предыдущие вычисления завершены, новые вычисления не начаты).
(until C11)
1) Доступы (чтения и записи) к volatile объектам происходят строго в соответствии с семантикой выражений, в которых они встречаются. В частности, они не переупорядочиваются относительно других обращений к volatile объектам в том же потоке.
(since C11)
2) При завершении программы данные, записанные в файлы, точно соответствуют тому, как если бы программа была выполнена в соответствии с написанным кодом.
3) Текст приглашения, отправляемый на интерактивные устройства, будет отображаться до того, как программа начнет ожидать ввод данных.
4) Если поддерживается прагма #pragma STDC FENV_ACCESS и она установлена в ON , то изменения в окружении с плавающей точкой (исключения с плавающей точкой и режимы округления) гарантированно соблюдаются операторами и вызовами функций с плавающей точкой, как если бы они выполнялись в точности как записано, за исключением того, что
  • результат любого выражения с плавающей точкой, кроме приведения и присваивания, может иметь диапазон и точность типа с плавающей точкой, отличного от типа выражения (см. FLT_EVAL_METHOD ),
  • несмотря на вышесказанное, промежуточные результаты любого выражения с плавающей точкой могут вычисляться как бы с бесконечным диапазоном и точностью (если только #pragma STDC FP_CONTRACT не установлена в OFF ).
(начиная с C99)

Примечания

Смотрите также

C++ documentation для as-if rule