+ -
当前位置:首页 → 问答吧 → C语言的副作用与序列点?

C语言的副作用与序列点?

时间:2011-12-22

来源:互联网

一,同一对象(内存),副作用等于序列点。对否?
二,如果一个表达式有两个或以上的序列点,其结果是未定义。对否?
如:
x=x++;
(1)x++,这个表达式x自增1,有副作用。也就是有1个序列点。
(2)x=x++,这个表达式赋值给x,也有副作用。这是第二个序列点。
那么,完整的表达式,有两个序列点,其结果是未定义!对否?

作者: mpaga   发布时间: 2011-12-22

http://topic.csdn.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?22007

怎么又问这种问题....
楼主对序列点的定义理解有误,参见上面的链接

作者: mingliang1212   发布时间: 2011-12-22

1楼:
  那里错了?
  我的理解是:如果同一内存保存了值,就说它有副作用。也就是有序列点。
 

作者: mpaga   发布时间: 2011-12-22

引用 2 楼 mpaga 的回复:
1楼:
那里错了?
我的理解是:如果同一内存保存了值,就说它有副作用。也就是有序列点。


副作用的全称是:表达式的副作用.
是针对表达式来说的,而不是针对内存来说的.只能说某个表达式有副作用.你上面的理解根本没有提到表达式..

如果一个表达式不仅算出一个值,还修改了环境,就说这个表达式有副作用(因为它多做了额外的事)。

序列点的意思1楼的链接里有,虽然是很长,但是看看吧..

作者: mingliang1212   发布时间: 2011-12-22

3楼:
  你所说的改变环境,不就是改变一内存区域么?

作者: mpaga   发布时间: 2011-12-22

4.7 我怎样才能理解复杂表达式?``序列点" 是什么?

序列点是一个时间点(在整个表达式全部计算完毕之后或在 ||、 &&、 ? : 或逗号 运算符处, 或在函数调用之前), 此刻尘埃落定, 所有的副作用都已确保结束。 ANSI/ISO C 标准这样描述: 
在上一个和下一个序列点之间, 一个对象所保存的值至多只能被表达式的计算修改一次。而且前一个值只能用于决定将要保存的值。 
第二句话比较费解。它说在一个表达式中如果某个对象需要写入, 则在同一表达式中对该对象的访问应该只局限于直接用于计算将要写入的值。这条规则有效地限制了只有能确保在修改之前才访问变量的表达式为合法。例如 i = i+1 合法, 而 a[i] = i++ 则非法 (参见问题 3.1)。 

作者: yulinlang   发布时间: 2011-12-22

引用 4 楼 mpaga 的回复:
3楼:
你所说的改变环境,不就是改变一内存区域么?


可以把表达式的环境理解成,当前表达式的所有子表达式的值.

作者: mingliang1212   发布时间: 2011-12-22

我看c++ primer plus 也看到之前也看到了这里了。 所谓的副作用,我个人的理解是一个表达式,被编译器算出了不需要的值,同时也就可能修改了某个变量或者是… 小弟新手,说的不对还望纠正!

作者: z462901566   发布时间: 2011-12-22

热门下载

更多