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
。这是允许的。分配和添加是不可观察的。
不过,所有可观察到的行为都必然是副作用。