栈帧的个人理解

    初学编程时候,总是在局部变量,全局变量,栈帧和闭包中懵懂游离,无法理解。比如下面最简单的程序:

package main

import "fmt"

func main() {
    var avg, sum = 0.0, 0.0
    fmt.Printf("初始化的avg=%v, sum=%v\n", avg, sum)
    var score = []float64{12.5, 34.3, 56.6, 34.43, 74.43, 23.98}
    avg = avgs(sum, score)
    fmt.Printf("计算后的avg=%v, sum=%v\n", avg, sum)
}

func avgs(sum float64, score []float64) float64 {
    for i := 0; i < len(score); i++ {
        sum += score[i]
    }
    fmt.Printf("函数avgs中的sum=%v\n", sum)
    return sum / float64(len(score))
}

   运行结果是:

初始化的 avg=0, sum=0
函数avgs中的 sum=236.24
计算后的 avg=39.373333333333335, sum=0

    在这里就会产生疑问,sum的值在函数avgs中改变,在函数结束后sum的值仍然为0。喜欢思考的同学就会疑问,我们对sum赋值操作了,怎么一会儿会改变,一会儿又不改变?通常老师的解释就是栈帧结构,但是这个结构如果不联想记忆的话就不好理解。其实在设计计算机的时候,处理事物的逻辑是模仿和适应我们人类的思维方式的,基于这一事实,我们把栈帧的内存类比成我们做题的“草稿纸”,我们在草稿纸上所有的计算过程在就算结束就会丢弃。如果在草稿纸上的计算过程改变了题目中的值,那么我们再做这道题就会引起混乱。
    当然,这里的解释只是通俗口语说法,只是帮助初学的同学记忆和理解。总结起来就是:栈帧是按人类逻辑思维模式模拟的计算机的数据结构。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容