免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: THEBEST
打印 上一主题 下一主题

什么是sequence point? [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
11 [报告]
发表于 2004-04-29 14:42 |只看该作者

什么是sequence point?

没关系。说得很好。
我对它们的概念也就懂一点点,
也不是很清楚。受教了。
呵呵,如果不影响你继续学别的内容,
慢慢理解好了。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
12 [报告]
发表于 2004-04-29 17:17 |只看该作者

什么是sequence point?

TITLE: What is a sequence point?

RESPONSE: jimad@microsoft.com (Jim Adcock)

Section 3.3 defines multiple accesses to one variable for modification
within an expression [between two sequence points] as being an
unconstrained error.


RESPONSE: mayoff@sylvester.cc.utexas.edu (rob)

Please define `sequence point'.


RESPONSE: jimad@microsoft.com (Jim Adcock), Microsoft Corporation, 12 Jul 93

The ANSI/ISO C++ standardization effort is being based on two documents,
both highly recommended.  One is the ARM, the other is X3.159-1989,
the ANSI C standards document [or equivalently it's ISO counterpart]

From the ANSI-C doc, 2.1.2.3.33

"At certain specified points in the execution sequence called
'sequence points', all side effects of previous evaluations shall be
complete and no side effects of subsequent evaluations shall have
take place.

Appendix B lists the following as sequence points, quote:

* The call to a function, after the arguments have been evaluated.

* The end of the first operand of the following operators: logical AND
&&; logical OR ||; conditional ? ; comma , .

* The end of a full expression: an initializer; the expression in an
expression statement; the controlling expression of a selection statement
(if or switch); the controlling expression of a while or do statement;
each of the three expressions of a for statement; the expression in
a return statement.

unquote.

论坛徽章:
0
13 [报告]
发表于 2004-04-30 09:30 |只看该作者

什么是sequence point?

算了,既然斑竹发话说没有关系,那我就再发最后一篇来解释这个问题。本来是希望用最简短的文字解释清楚,没想到越是想简洁越是没说清。

C语言中,只包含一个表达式的语句,如
x = (i++) * 2;
称为“表达式语句”。表达式语句结尾的";"是C标准定义的顺序点之一,但这不等同于说所有的";"都是顺序点,也不是说顺序点只有这一种。下面就是标准中定义的顺序点:

函数调用时,实参表内全部参数求值结束,函数的第一条指令执行之前(注意参数分隔符“,”不是顺序点);
&&操作符的左操作数结尾处;
||操作符的左操作数结尾处;
?:操作符的第一个操作数的结尾处;
逗号运算符;
表达式求值的结束点,具体包括下列几类:自动对象的初值计算结束处;表达式语句末尾的分号处;do/while/if/switch/for语句的控制条件的右括号处;for语句控制条件中的两个分号处;return语句返回值计算结束(末尾的分号)处。

定义顺序点是为了尽量消除编译器解释表达式时的歧义,如果顺序点还是不能解决某些歧义,那么标准允许编译器的实现自由选择解释方式。理解顺序点还是要从定义它的目的来下手。

再举一个例子:
y = x++, x+1;
已知这个语句执行前x=2,问y的值是多少?
逗号运算符是顺序点。那么该表达式的值就是确定的,是4,因为按照顺序点的定义,在对x+1求值前,顺序点","前的表达式——x++求值的全部副作用都已发生完毕,计算x+1时x=3。这个例子中顺序点成功地消除了歧义。
注意这个歧义是怎样消除的。因为中间的顺序点使“相邻顺序点间对象的值只更改一次”的条件得到满足。

y = (x++) * (x++), 执行前x=2, y=?
答案是,因为这个表达式本身不包含顺序点,顺序点未能消除歧义,编译器生成的代码使y取4, 6(以及更多的一些可能值)都是符合标准定义的,程序员自己应为这个不符合顺序点定义的表达式造成的后果负责。

我对我自己的表达能力欠佳表示抱歉,但我的确不准备对这个问题再做更多的解释。我愿意引用《Expert C Programming》中的一段话,来给自己找一个下台阶:
However, the problem with standards manuals is that they only make sense if you already know what they mean. If people write them in English, the more precise they try to be, the longer, duller and more obscure they become. If they write them using mathematical notation to define the language, the manuals become inaccessible to too many people.
自然语言本身的不精确,往往容易造成越解释越不清楚的现象,而精确的数学语言,又已经超过包括我在内的大多数人的理解和应用能力。

谢谢the best提供的这个机会来检验对知识点的理解程度;也谢谢斑竹对这个讨论的支持。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
14 [报告]
发表于 2004-04-30 12:49 |只看该作者

什么是sequence point?

chg.s   总是这么谦虚,搞的我都不好意思再纠缠下去.
不过你也解释的很多了,不是你表达能力差可能是我的IQ不及格吧.
"自然语言本身的不精确,往往容易造成越解释越不清楚的现象"
很好!

论坛徽章:
0
15 [报告]
发表于 2004-06-29 11:46 |只看该作者

什么是sequence point?

chg.s C++不错。

在C++里面我们写一个表达式,我们认为只有一个目的:
i=j++;//目的是为了给i赋值
func(i++);//目的是为了调用函数
所以j被加1和i被加1这样的结果,我们认为是“副作用”。这就好比你吃药杀葡萄球菌,但是把大肠杆菌也杀了,这就是副作用。

我们再看一个表达式
j=(i++)+(i++);
i++这个式子的意思大家都知道,就是取i过去的值,然后把i加1。那么编译器开始分析这个式子了。
它可以这样做:取i的值,然后再取i的值(加1的事情当然要做,可是没说什么时候),然后把这两个i加起来,再给i做两次加1操作
也可以这样做:取i的值,然后给i加1,然后再取i的值,...
总之,不同的解释方法,结果不同,你去写这样的表达式,就是玩火。

不知道我有没有把这两个概念解释清楚,如果大家理解了,再去看chg.s写的,就会明白了。

论坛徽章:
0
16 [报告]
发表于 2008-10-31 11:47 |只看该作者
原帖由 chg.s 于 2004-4-27 21:44 发表
表达式的计算分为两种,一种是有副作用的计算,如:
(++x)+y
一种是无副作用的计算,如:
x*y

有副作用的计算中,子表达式的计算顺序是重要的。例如
(++x)*(x+1)
当x=0时,如果先算++x,上式计算结果为 ...

真是太复杂了。。。。有点看不懂啊。

论坛徽章:
0
17 [报告]
发表于 2008-10-31 13:23 |只看该作者
原帖由 chg.s 于 2004-4-30 09:30 发表
算了,既然斑竹发话说没有关系,那我就再发最后一篇来解释这个问题。本来是希望用最简短的文字解释清楚,没想到越是想简洁越是没说清。

C语言中,只包含一个表达式的语句,如
x = (i++) * 2;
称为“表达式 ...

这个分析非常好 我看懂了

论坛徽章:
0
18 [报告]
发表于 2008-10-31 13:35 |只看该作者
原帖由 chg.s 于 2004-4-30 09:30 发表
算了,既然斑竹发话说没有关系,那我就再发最后一篇来解释这个问题。本来是希望用最简短的文字解释清楚,没想到越是想简洁越是没说清。

C语言中,只包含一个表达式的语句,如
x = (i++) * 2;
称为“表达式 ...

BTW
你的解释有些小问题
y = x++, x+1;
已知这个语句执行前x=2,问y的值是多少?
这个y的值是2
你说的4是
y = (x++, x+1);

论坛徽章:
0
19 [报告]
发表于 2012-03-01 23:43 |只看该作者
mark

论坛徽章:
0
20 [报告]
发表于 2012-03-02 10:58 |只看该作者
讲解的很到位,mark!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP