C语言的副作用与序列点?
时间:2011-12-22
来源:互联网
二,如果一个表达式有两个或以上的序列点,其结果是未定义。对否?
如:
x=x++;
(1)x++,这个表达式x自增1,有副作用。也就是有1个序列点。
(2)x=x++,这个表达式赋值给x,也有副作用。这是第二个序列点。
那么,完整的表达式,有两个序列点,其结果是未定义!对否?
作者: mpaga 发布时间: 2011-12-22
怎么又问这种问题....
楼主对序列点的定义理解有误,参见上面的链接
作者: mingliang1212 发布时间: 2011-12-22
那里错了?
我的理解是:如果同一内存保存了值,就说它有副作用。也就是有序列点。
作者: mpaga 发布时间: 2011-12-22
1楼:
那里错了?
我的理解是:如果同一内存保存了值,就说它有副作用。也就是有序列点。
副作用的全称是:表达式的副作用.
是针对表达式来说的,而不是针对内存来说的.只能说某个表达式有副作用.你上面的理解根本没有提到表达式..
如果一个表达式不仅算出一个值,还修改了环境,就说这个表达式有副作用(因为它多做了额外的事)。
序列点的意思1楼的链接里有,虽然是很长,但是看看吧..
作者: mingliang1212 发布时间: 2011-12-22
你所说的改变环境,不就是改变一内存区域么?
作者: mpaga 发布时间: 2011-12-22
序列点是一个时间点(在整个表达式全部计算完毕之后或在 ||、 &&、 ? : 或逗号 运算符处, 或在函数调用之前), 此刻尘埃落定, 所有的副作用都已确保结束。 ANSI/ISO C 标准这样描述:
在上一个和下一个序列点之间, 一个对象所保存的值至多只能被表达式的计算修改一次。而且前一个值只能用于决定将要保存的值。
第二句话比较费解。它说在一个表达式中如果某个对象需要写入, 则在同一表达式中对该对象的访问应该只局限于直接用于计算将要写入的值。这条规则有效地限制了只有能确保在修改之前才访问变量的表达式为合法。例如 i = i+1 合法, 而 a[i] = i++ 则非法 (参见问题 3.1)。
作者: yulinlang 发布时间: 2011-12-22
3楼:
你所说的改变环境,不就是改变一内存区域么?
可以把表达式的环境理解成,当前表达式的所有子表达式的值.
作者: mingliang1212 发布时间: 2011-12-22
作者: z462901566 发布时间: 2011-12-22
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28