C++ 副作用和可观察到的行为在C++;?

C++ 副作用和可观察到的行为在C++;?,c++,side-effects,C++,Side Effects,C++03标准1.9/6定义了可观察的行为: 抽象机器的可观察行为是它对易失性数据的读写序列以及对库I/O函数的调用 然后1.9/7定义了副作用: 访问由易失性左值(3.10)指定的对象、修改对象、调用库I/O函数或调用执行这些操作的函数都是副作用,这些都是执行环境状态的变化 副作用是否是可观察到的行为?它们之间的关系如何?不,副作用不一定是可以观察到的行为。例如,修改非易失性对象是一种副作用,但不可观察。差异很重要,因为只要可观察到的行为保持不变,编译器可能会重新安排或完全消除副作用 int

C++03标准1.9/6定义了可观察的行为:

抽象机器的可观察行为是它对易失性数据的读写序列以及对库I/O函数的调用

然后1.9/7定义了副作用:

访问由易失性左值(3.10)指定的对象、修改对象、调用库I/O函数或调用执行这些操作的函数都是副作用,这些都是执行环境状态的变化


副作用是否是可观察到的行为?它们之间的关系如何?

不,副作用不一定是可以观察到的行为。例如,修改非易失性对象是一种副作用,但不可观察。差异很重要,因为只要可观察到的行为保持不变,编译器可能会重新安排或完全消除副作用

int main()
{
    int a;
    a = 30;
    a += 2;
    return 0;
}
如果需要,大多数编译器将完全删除
a
。这是允许的。赋值和加法是不可见的

然而,所有可观察到的行为必然是副作用