提问者:小点点

副作用和可观察的行为在C语言中是如何联系的?


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

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

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

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

副作用是否是可观察到的行为?它们之间有什么关系?


共1个答案

匿名用户

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

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

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

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