c - c中的序列点

标签 c sequence-points

A sequence point in imperative programming defines any point in a computer program's execution at which it is guaranteed that all side effects of previous evaluations will have been performed, and no side effects from subsequent evaluations have yet been performed.

这是什么意思?有人可以用简单的语言解释一下吗?

最佳答案

当一个序列点出现时,基本上意味着你可以保证之前的所有操作都完成了。

在没有中间序列点的情况下更改变量两次是未定义行为的一个示例。

例如,i = i++; 是未定义的,因为 i 的两次更改之间没有序列点。

Note that it's not just changing a variable twice that can cause a problem. It's actually a change involved with any other use. The standard uses the term "value computation and side effect" when discussing how things are sequenced. For example, in the expression a = i + i++, the i (value computation) and i++ (side effect) may be done in arbitrary order.

维基百科有一个 list of the sequence points在 C 和 C++ 标准中,尽管最终列表应始终取自 ISO 标准。来自 C11 附录 C(释义):


以下是标准中描述的序列点:

  • 在函数调用和实际调用中对函数指示符和实际参数的求值之间;
  • 在运算符 &&|| 的第一个和第二个操作数的求值之间;
  • 在对条件 ?: 运算符的第一个操作数求值与对第二个和第三个操作数中的任何一个进行求值之间;
  • 完整声明符的结尾;
  • 在完整表达式的评估和下一个要评估的完整表达式之间。以下是完整的表达:
    • 一个初始化器;
    • 表达式语句中的表达式;
    • 选择语句的控制表达式(ifswitch);
    • while 或 do 语句的控制表达式;
    • for 语句的每个表达式;
    • return 语句中的表达式。
  • 紧接在库函数返回之前;
  • 在与每个格式化输入/输出函数转换说明符关联的操作之后;
  • 紧接在每次调用比较函数之前和之后,以及在对比较函数的任何调用与作为参数传递给该调用的对象的任何移动之间。

关于c - c中的序列点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3575350/

相关文章:

检查系统功能值

c++ - 在 vim 中自动关闭 C/C++ 文件中的 xml 标签

c++ - C和C++中带有序列点和UB的差异

c - 为什么这些构造使用增量前和增量后未定义的行为?

令人困惑的答案 : One says *myptr++ increments pointer first, 其他人说 *p++ 取消引用旧指针值

c - 序列点和副作用

c - 如何返回带数组的 C 结构体?

C - 这段代码有什么问题,在用户输入他的猜测后它不会继续?

c - 我可以在 C 程序中同时打开多少个临时文件?

c - 为什么这些构造使用增量前和增量后未定义的行为?