14

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

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

然后 1.9/7 定义了副作用

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

副作用是可观察到的行为吗?它们是如何相互关联的?

4

1 回答 1

16

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

int main()
{
    int a;
    a = 30;
    a += 2;
    return 0;
}

如果要求,大多数编译器将a完全删除。这是允许的。分配和添加是不可观察的。

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

于 2012-11-07T14:18:09.320 回答