副作用 / 编程语言 · 2023年 10月 14日 0

副作用

40 次浏览

副作用产生于表达式中有至少一处计算,且其中全部或部分计算会影响表达式其他项,这可能产生副作用。编译器的优化很可能凸显副作用。

赋值

副作用并非都是有害的,比如基本的赋值 a = b, 对a而言是产生副作用,但完成了赋值要求。

序列点

  • C语言标准提出了”序列点”的概念,但没有定义序列点以内计算的顺序。序列点(Sequence Point)是一个程序中的特定点,在这个点上,编译器会保证所有的副作用完全生效并且表达式的值被计算出来。
  • 序列点的主要概念来自C语言的未定义行为(Undefined Behavior)规则,这个规则指出如果两个不同的表达式的副作用会影响到同一个对象,而且其中一个表达式的副作用在另一个表达式之前发生,那么结果会是未定义的。
  • C标准规定序列点包含:完整表达式 (full expression)、表示语句结束的分号、逻辑运算符 && 和 ||和逗号运算符。
  • 例如a = i++ + i++ 最终结果不确定,因为两个i++的计算不保证计算顺序。