c++中的副作用是什么意思

ghost1023 2008-07-01 10:47:25
c++中的副作用是什么意思
...全文
294 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
macfan 2008-07-02
  • 打赏
  • 举报
回复
编译器和你理解不用,引起歧义.
MFC_USER 2008-07-02
  • 打赏
  • 举报
回复
int x = 1, y;
y = x++ + x++;

这段代码引起y肯能会等于2或者3的意思是:
x=1,x+x=1+1=2,然后赋值给y。
或者x=1,在进行与后面的x的加法运算前又自加一,变成二。然后1+2=3赋值给y.

是这个意思吗?
K行天下 2008-07-02
  • 打赏
  • 举报
回复
副作用在C++ Primer Plus有详细介绍

浅谈C++中表达式副作用的影响 这是维普里面的一篇论文!
ghost1023 2008-07-02
  • 打赏
  • 举报
回复
thx~~
HelloDan 2008-07-01
  • 打赏
  • 举报
回复
34. 副作用与序列点

来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:精品
发布于2006-05-26 22:42 被读2212次 【字体:大 中 小】

C 语言中,术语副作用(side effect)是指对数据对象或者文件的修改。例如,以下语句

var = 99;

的副作用是把 var 的值修改成 99。对表达式求值也可能产生副作用,例如:

se = 100

对这个表达式求值所产生的副作用就是 se 的值被修改成 100。

序列点(sequence point)是指程序运行中的一个特殊的时间点,在该点之前的所有副作用已经结束,并且后续的副作用还没发生。

C 语句结束标志——分号(;)是序列点。也就是说,C 语句中由赋值、自增或者自减等引起的副作用在分号之前必须结束。我们以后会说到一些包含序列点的运算符。任何完整表达式(full expression)运算结束的那个时间点也是序列点。所谓完整表达式,就是说这个表达式不是子表达式。而所谓的子表达式,则是指表达式中的表达式。例如:

f = ++e % 3

这整个表达式就是一个完整表达式。这个表达式中的 ++e、3 和 ++e % 3 都是它的子表达式。

有了序列点的概念,我们下面来分析一下一个很常见的错误:

int x = 1, y;
y = x++ + x++;

这里 y = x++ + x++ 是完整表达式,而 x++ 是它的子表达式。这个完整表达式运算结束的那一点是一个序列点,int x = 1, y; 中的 ; 也是一个序列点。也就是说,x++ + x++ 位于两个序列点之间。标准规定,在两个序列点之间,一个对象所保存的值最多只能被修改一次。但是我们清楚可以看到,上面这个例子中,x 的值在两个序列点之间被修改了两次。这显然是错误的!这段代码在不同的编译器上编译可能会导致 y 的值有所不同。比较常见的结果是 y 的值最后被修改为 2 或者 3。在此,我不打算就这个问题作更深入的分析,各位只要记住这是错误的,别这么用就可以了。有兴趣的话,可以看看以下列出的相关资料。

相关资料:
自增运算符和自减运算符
让我耿耿于怀的一道笔试题

C 语言标准对副作用和序列点的定义如下:

Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment. Evaluation of an expression may produce side effects. 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 taken place.

翻译如下:

访问易变对象,修改对象或文件,或者调用包含这些操作的函数都是副作用,它们都会改变执行环境的状态。计算表达式也会引起副作用。执行序列中某些特定的点被称为序列点。在序列点上,该点之前所有运算的副作用都应该结束,并且后继运算的副作用还没发生。

参考资料:C Primer 5th Edition
The C Programming Language 2nd Edition
C99 标准
HelloDan 2008-07-01
  • 打赏
  • 举报
回复
design must not have side effects (i.e., it can’t affect variables that are neither local nor
passed to the functions as parameters).

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧