整数表达式的 C++ 常量折叠的预期行为是什么?

What is the expected behavior of C++ constant folding of integer expressions?

例如,假设我们有一个函数将 int 的两个最低有效小数位替换为 0:

int Remove2LSD(int x)
{
  return x / 100 * 100;
}

如果我们通过 2052,我们应该期待 2000 的 return,2199 应该 return 2100.

如果你 运行 它有或没有优化,似乎 MSVC 编译器不会发生常量折叠,这是我所期望的,因为 x / 100 应该在 [=18] 之前评估=],并且我们不会在编译时计算 x / 100。参数 x 来自 运行 时间输入。

根据我的假设和测试,我认为我不必担心不断将 return x / 100 * 100; 更改为 return x; ;但是,我希望找到关于这种情况下预期行为的更好文档,而不是仅仅依赖于我的假设和测试。

关于这种行为有什么好的文档吗?我查看了 SO 和网络上的其他地方,但未能找到对我有用的文档。

大多数优化(包括常量折叠)都由 as-if rule 控制。它声明允许任何优化 当且仅当 它不会改变程序的可观察行为(它“就像”未优化一样)。

所以不,你不需要担心这里的不断折叠。