在C序列点 [英] sequence points in c

查看:162
本文介绍了在C序列点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在命令式编程的序列点定义在它被保证previous评估所有的副作用将被执行在计算机程序的执行的任何位置,都尚未完成从后续评估无副作用。

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.

这是什么意思?可有人请用通俗的话解释一下吗?

What does this mean? Can somebody please explain it in simple words?

推荐答案

在一个序列点出现,这基本上意味着你保证,所有的previous操作完成。

When a sequence point occurs, it basically means that you are guaranteed that all previous operations are complete.

更改变量两次没有插入顺序的一点是未定义行为的一个例子。

Changing a variable twice without an intervening sequence point is one example of undefined behaviour.

例如, I = I ++; 是不确定的,因为有两个变化之间没有顺序点 I

For example, i = i++; is undefined because there's no sequence point between the two changes to i.

维基百科有序列的列表中的C和C ++标准指出虽然最终名单应该始终取自ISO标准。从C99附录C:

Wikipedia has a list of the sequence points in the C and C++ standards although the definitive list should always be taken from the ISO standard. From C99 appendix C:

5.1.2.3中所描述的序列点以下内容:

The following are the sequence points described in 5.1.2.3:


  • 要一个函数的调用,后面的变量进行了评价(6.5.2.2)。

  • 以下运算符的第一个操作的结束:逻辑与&放大器;&安培; (6.5.13);
    逻辑或|| (6.5.14);有条件的? (6.5.15);逗号,(6.5.17)。

  • 一个完整的声明符的末尾:说明符(6.7.5);

  • 一个完整的前pression的结束:一个初始化(6.7.8);在离pression除权pression
    声明(6.8.3);选择语句的控制前pression(if或switch)
    (6.8.4);一阵控股前pression或做陈述(6.8.5);每个
    的前pressions for语句(6.8.5.3);在return语句前pression
    (6.8.6.4)。

  • 立即库函数返回(7.1.4)。

  • 后,每个格式化的输入/输出功能转换相关的动作
    符(7.19.6,7.24.2)。

  • 之前和每次调用比较函数后,立即与
    还到一个比较功能的任何呼叫和对象的任何运动之间
    作为参数传递给该呼叫(7.20.5)通过。

C11改变了措辞。这似乎已经打破了三元运算符,并添加一些细节:

C11 has the wording changed. It appears to have broken out the ternary operator and added some more detail:

5.1.2.3中所描述的序列点以下内容:

The following are the sequence points described in 5.1.2.3:


  • 功能标志的一个函数的评估和实际参数之间
    呼叫和实际调用。 (6.5.2.2)。

  • 以下运营商的第一和第二操作数的评价之间:
    逻辑与&放大器;&安培; (6.5.13);逻辑或|| (6.5.14);逗号,(6.5.17)。

  • 有条件的第一个操作的评估期间:运营商和
    第二和第三运算数取其评价(6.5.15)。

  • 一个完整的声明符的末尾:说明符(6.7.6);

  • 一个完整的前pression的评估和下一个完整的前pression之间进行
    评估。下面是完整的前pressions:一个初始化(6.7.9);恩pression在
    一个前pression声明(6.8.3);选择语句的控制前pression
    (如果或开关)(6.8.4);一阵或控制前pression do语句
    (6.8.5);每个for语句的前任pressions的(6.8.5.3);在恩pression
    return语句(6.8.6.4)。

  • 立即库函数返回(7.1.4)。

  • 后,每个格式化的输入/输出功能转换相关的动作
    符(7.21.6,7.28.2)。

  • 之前和每次调用比较函数后,立即与
    还到一个比较功能的任何呼叫和对象的任何运动之间
    作为参数传递给该呼叫(7.22.5)通过。

这篇关于在C序列点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆