-
Notifications
You must be signed in to change notification settings - Fork 0
Evaluation
wzs edited this page Aug 27, 2018
·
1 revision
- 以下函数的执行结果(主要是
calc("1", a, calc("10", a, b)))func calc(index string, a, b int) int { ret := a + b fmt.Println(index, a, b, ret) return ret } func main() { a := 1 b := 2 defer calc("1", a, calc("10", a, b)) a = 0 defer calc("2", a, calc("20", a, b)) b = 1 }
- 求值策略(Evaluation strategy) 是 确定 编程语言中 表达式的求值 的一组规则; 求值策略定义了 在什么时间 以什么次序 对函数的实参 如何求值, 并且 什么时候代换入函数, 以及以何种方式生.
- 基于如何处理函数实参, 求值策略 分为两大类: 严格求值 / 非严格求值
- 严格求值: 函数实参在函数调用前就求值
- 多数语言都是用严格求值
- 通俗讲, 严格求值就是 执行到函数调用时, 如果函数参数中有表达式, 则立即计算表达式的值, 然后将该值入栈, 在函数执行时使用此值.(引用类型保证传入的地址不变, 值类型保证传入的值不变)
- 严格求值也称 热情求值
- 定义
- 在什么时间: 函数调用前.
- 什么次序: 后序遍历: 以二叉树距离, 就是 先从左子树, 叶子层开始, 逐次遍历.
- 如何求值
- 传值调用: 参数是传入值的值拷贝.
- 传引用调用: 传递给函数的是传入值的隐式引用而不是值拷贝.
- 有些语言使用指针模拟引用传递. 所以传引用调用 有时也称 传地址调用.
- 传共享对象引用: 函数参数和传入值 共享一个对象, 不发生拷贝, 两者是一个值.
- Python, Java对象类型 使用 传共享对象引用
- 传附件-恢复调用: 特殊情况, 不写了.
- 部分求值: 暂时不写.
- 非严格求值: 不主动对函数实参求值, 除非该实参在函数体内被使用, 也称惰性求值.
- 定义
- 在什么时间: 惰性求值
- 什么次序: 正常次序, 既最左最外, 总是先求最外层的表达式. 以二叉树举例, 就是从左侧根部开始.
- 如何求值
- 传名引用: 如果实际参数在函数的求值中未被用到, 则它永不被求值; 如果这个实际参数使用多次, 则它每次都被重新求值
- 实参: 调用函数时, 传递给函数的参数.
- 形参: 函数签名中函数的参数. 形式参数.