如同(as-if)规则

来自cppreference.com
< c‎ | language


允许进行任何以及所有的不会改变程序的可观察行为的代码变换。

解释

只要维持以下各项为真,就允许 C 编译器对程序实施任何改变:

1) 在每个定序点,所有 volatile 对象的值均已稳定(之前的求值已完成,新求值尚未开始)。
(C11 前)
1)volatile 对象的访问(读和写),严格按照它们出现的表达式的语义发生。尤其是,它们与同一线程中的其他 volatile 访问之间不会重排序
(C11 起)
2) 程序终止时,写入文件的数据与按所写代码执行严格相同。
3) 发送给交互式设备的提示文本将于程序等待输入之前显示。
4) 如果支持语用 #pragma STDC FENV_ACCESS 且已设为 ON,则对浮点环境(浮点异常和舍入模式)的改变保证会由浮点算术运算符和函数调用观察到,如同按所写代码执行一样,不过
  • 任何不是转型和赋值的浮点表达式,可以与表达式的类型具有不同的浮点类型范围和精度(参见 FLT_EVAL_METHOD),
  • 尽管有以上规定,任何浮点表达式的中间结果,可按如同具有无穷范围和精度计算(除非 #pragma STDC FP_CONTRACTOFF)。
(C99 起)

注解

参阅