Namespaces
Variants

As-if rule

From cppreference.net

允许任何不改变程序可观察行为的代码转换。

说明

C 编译器被允许对程序执行任何更改,只要以下条件保持不变:

1) 在每个 序列点 处,所有 volatile 对象的值都是稳定的(先前的求值已完成,新的求值尚未开始)。
(C11前)
1) volatile 对象的访问(读取和写入)严格遵循其所在表达式的语义。特别地,它们不会与同一线程中的其他volatile访问发生 重排序
(C11起)
2) 在程序终止时,写入文件的数据完全如同程序按编写方式执行一样。
3) 发送至交互设备的提示文本将在程序等待输入前显示。
4) 若支持编译指示 #pragma STDC FENV_ACCESS 且其设置为 ON ,则保证浮点算术运算符和函数调用能观察到对 浮点环境 (浮点异常和舍入模式)的修改,如同按代码书写顺序执行,但以下情况除外:
  • 除强制类型转换和赋值外的任何浮点表达式的结果,可能具有与该表达式类型不同的浮点类型的取值范围和精度(参见 FLT_EVAL_METHOD ),
  • 尽管有上述规定,任何浮点表达式的中间结果仍可能以无限范围和精度进行计算(除非 #pragma STDC FP_CONTRACT 设置为 OFF )。
(C99 起)

注释

参见

C++ 文档 关于 as-if rule