c-中的时序点和副作用边际效应

转自:http://mockbird.gotoip55.com/2011/11/30/c-中的时序点和副作用边际效应/

本文基本是以下几篇文章的摘抄和归纳。

http://en.wikipedia.org/wiki/Sequence_point
http://learn.akae.cn/media/ch16s03.html

请问 以下计算结果是什么:

int a=0;
a = (++a)+(++a)+(++a)+(++a);

这种题可能很多人面试的时候都做过,但严重怀疑出题人是不是真的懂得答案是什么,因为答案其实是未知的,想知道为什么,就必须理解清楚什么是C/C++中的顺序点和副作用。

顺序点(Sequence Point)和副作用(Side effects)分别是什么,会带来什么问题,可能很多初学者对此并不了解,很多老手也可能会在这个问题上载跟头。

标准定义

ISO14882:1998中1.9节第7款的叙述:顺序点是前一求值中所有副作用已经结束而下一求值中任何副作用尚未开始的地方。具体来说,有以下几个地方:

1.在每一个完整表达式结束的地方是Sequence Point。用ISO14882中的术语,就是完全表达式(full-expression)结束的地方。比如有f(); g();这样两条语句,f()和g()是两个完整的表达式,f()的Side Effect必定在g()之前发生。

2.在一个函数所有参数求值完以后并且在准备调用该函数之前是Sequence Point。比如调用foo(f(), g())时,foo、f()、g()这三个表达式哪个先求值哪个后求值是Unspecified,但是必须都求值完了才能做最后的函数调用,所以f()和g()的Side Effect按什么顺序发生不一定,但必定在这些Side Effect全部作用完之后才开始调用foo函数。

3.当一个函数返回的时候,就是在返回值已经被复制以后,而在运行该函数所有外部之前是Sequence Point。

4.在库函数即将返回时是Sequence Point。这条规则似乎可以包含在上一条规则里面,因为函数返回时必然会结束掉一个完整的表达式。而事实上很多库函数是以宏定义的形式实现的,并不是真正的函数,所以才需要有这条规则。

5.在下列表达式中的第一个表达式求值之后是Sequence Point。假设这里用的都是内置运算符而没有被重载。

  • expr1 && expr2
  • expr1 || expr2
  • expr1 ? expr2:expr3
  • expr1 , expr2

6.在一个完整的声明末尾是Sequence Point。所谓完整的声明是指这个声明不是另外一个声明的一部分。比如声明int a[10], b[20];,在a[10]末尾是Sequence Point,在b[20]末尾也是。

C++里说,如果在两个时序点之间有两个或多个副作用,那么这些副作用的时序是不定的。如果表达式的值依赖于这些副作用间的顺序,那么表达式的值也是不定的。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
变长指令周期是指在计算机指令执行过程,不同指令所需要的周期长度可能不同。时序发生器FSM(Finite State Machine)设计是一种用于控制时序的方法。 在设计变长指令周期的时序发生器FSM时,首先需要确定指令执行的各个阶段,并给每个阶段分配一个时钟周期。这些阶段可以包括指令获取、指令解码、操作数准备、运算、结果存储等。不同指令所需的时钟周期数会根据指令的复杂性和执行过程所需的操作不同而有所不同。 设计时序发生器FSM时,可以采用状态机(State Machine)的概念。状态机可以用状态和状态之间的转换来表示指令执行的不同阶段。根据指令的特性,可以将不同指令识别为不同的状态,然后根据指令的不同要求和执行过程的需要,确定状态之间的转换条件和转换逻辑。 在设计时需要考虑的是,如何根据指令的类型和执行过程的要求,灵活地控制时序发生器FSM的状态转换。可以使用逻辑电路或程序设计来实现这些状态转换逻辑。通过合理地设计状态和转换条件,可以满足不同指令的执行需求,使得变长指令周期得以实现。 总的来说,变长指令周期的时序发生器FSM设计需要确定指令执行的各个阶段和时钟周期,并采用状态机的概念来表示不同指令的不同阶段。根据指令的要求和执行过程的需要,通过逻辑电路或程序设计,灵活地控制时序发生器FSM的状态转换,实现变长指令周期的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值