C 语言序列点

2024 年 8 月 28 日 | 3 分钟阅读

在本文中,我们将学习C语言中的序列点是什么。此外,为了更轻松地理解它们,我们还将讨论一些序列点的示例以及它们的实际实现。

引言

总的来说,我们可以将序列点视为程序执行中的任何点,在该点可以保证或确保程序代码的先前求值的所有副作用都已完成或成功执行。但是,它也确保先前求值的任何更改或副作用尚未被后续求值执行。换句话说,在命令式编程中,序列点定义了程序执行中的任何点,在该点可以保证先前求值的所有副作用都已完成。此外,后续求值还没有执行任何副作用。在这种情况下,“副作用”这个词可能会让你感到困惑。但是,如果确实如此,那么让我们来看看“副作用”到底是什么。

副作用

“副作用”一词是指任何函数或表达式产生的副作用或更改,这些更改会改变事物的状态。

要更详细地理解序列点,您可以考虑以下示例

示例 1

上述程序的输出是未定义的或不可预测的,因为上述程序的输出在不同的机器或编译器上会有所不同,因为它就像询问一个未定义的自动变量的值一样。上述程序行为未定义的根本原因是“+”运算符对其操作数没有定义标准的求值顺序。因此,我们无法预测哪个函数“f1”或“f2”会先执行。但是,除了“+”运算符之外,还有许多其他类似的运算符,如“-”、“/”、“*”、按位与&、“|”(按位或)、等等。

示例 2

上述程序的输出也是未定义的,因为即使表达式的求值也可能导致副作用。例如,在上述程序中,p的最终值是模糊的,因为它完全取决于表达式的求值顺序。因此,如果函数“f1();”先执行,p的值将为55;否则为40。

序列点

以下是一些C语言中可用的基本序列点

  1. 逻辑与 &&
  2. 逻辑或 ||
  3. 条件 ?
  4. 逗号 ,

1. 逻辑与 &&

对于逻辑与 && 运算符,它的左操作数将先完全求值,并完成其所有副作用,然后再继续。但是,如果左操作数求值为false,则执行过程将停止,并且另一个操作数根本不会执行。

2. 逻辑或 ||

对于逻辑或 ||,它的左操作数必须先完全求值并完成其所有副作用,然后再继续。但是,如果左操作数求值为false(或非零),则另一个操作数根本不会被执行。

3. 条件?

在条件运算符的情况下,将首先对条件运算符的第一个操作数进行求值,并在继续之前完成其所有副作用。

4. 逗号,

逗号运算符的左操作数必须先完全求值,并完成其所有副作用,然后再继续。但是,逗号运算符的两个操作数始终被求值。

注意:函数调用中的逗号运算符不保证求值顺序。


下一个主题C语言中的字谜