Way on c & c++ 小记 [一]

标题:那一抹绿色

       想来大多数学习C语言的人都是从谭浩强教授那本绿色封面的《C语言程序设计》入门的,我也是其中之一。记得那是在大学入学前,我在泉州九一街十字路口的晓风书屋(后来为风雅颂)买下了那本书。

命运的手掌轻轻一抚,就突如其来地使得我选择了计算机专业,这是我所始料不及的。虽然计算机也是我的兴趣,虽然高中时代在家还会津津有味地对着《黑客X档案》或者《电脑爱好者》的VB教程敲个QQ盗号程序或者趣味小程序,但是我从来没有想过会去读计算机专业,现在看来倒真有点不能理解为何如此。不过细细想来,一个不可忽视的原因可能会是相较于划拉VB界面,我有更多的时候是在看比如今何在的《悟空传》,然后为封面的那几句话振奋不已,为里面的爱情故事揪心不已,比如余秋雨的《千年一叹》,然后因为耶路撒冷那座挂着许多天真儿童画像的大屠杀纪念馆难过不止,又比如《三国演义》,比如《史记》……

虽然理工科更偏向的是逻辑的严密性,但命运手掌的指缝间难免遗漏点伤春悲秋的细屑,比如现在。不过却不会再一发不可收拾。

如果一味地搞文学气息,想必我都可以改行去尝试做个诗人或者作家了,而不必在此整理回顾我所学过的计算机知识了。

----------------------------------------cuttingline----------------------------------------

那么,回到学术问题上,以一段简单的代码开始这段旅程:

#include <stdio.h>

/*
 *Jason Lee
 *良好的多行注释风格
 *一般用于程序说明或者函数说明
 */

void colorGreen(){
       printf("那一抹绿色/n");//单行注释
}

int main(int argc, char *argv[]){
       colorGreen();
       printf("%d/n",argc);
       printf("%s/n",argv[0]);
       return 0;
}

       以上代码是典型的C程序结构,其中值得提的有两个地方:一是开始的多行注释,现在编写程序应尽量使用良好的注释风格和命名习惯;二是主函数的两个参数,分表代表系统调用程序时给的参数个数和参数列表,默认有一个参数argv[0],即程序本身。

       那么,这个程序的运行过程是如何的呢?当然,我指的是在内存中执行的某方面。

       操作系统使用栈式、堆式两种内存分配方法,而在管理函数调用方面采取的是栈式分配策略。堆和栈是朝着对方进行扩展的,栈向下扩伸,而堆相反。

       首先自然是main函数得到调用,它在栈中获得了一片存储区域,称为活动记录,里面保存着该函数的变量、参数等信息,在此不妨将之称为main活动记录。紧接着main函数调用colorGreen函数,同样的,colorGreen也在栈中建立了一个活动记录,并且紧接在main活动记录下方。系统总是对栈顶的活动记录进行操作,当然不总是成功,在这里我们假设操作成功,于是系统执行colorGreen结束后将栈顶元素出栈,继续操作栈顶元素,此时就是main活动记录了。

      


main活动记录


colorGreen活动记录

 

       不妨增加一个colorRed函数,功能类似colorGreen,并且将之放置在main函数中紧接colorGreen之后,即调用colorGreen后马上调用colorRed。这时候的活动记录存活顺序是:main活动记录进栈,colorGreen活动记录进栈,colorGreen活动记录出栈,colorRed活动记录进栈,colorRed活动记录出栈,继而继续执行main函数。如果我们将之看做树的形式,即main函数的左儿子是colorGreen,右儿子是colorRed,可以看出是一个后序遍历的过程。并且可以知道,某结点的左兄弟(如果有的话)总是先于该结点消亡,沿该结点往上直达树根对应了栈中最底层的活动记录往上直到main函数。

2010-1-24

----------------------------------------cuttingline----------------------------------------

 

时间: 2024-11-08 19:26:59

Way on c &amp; c++ 小记 [一]的相关文章

js substr、substring和slice使用说明小记_javascript技巧

关于substr.substring和slice方法区别的文章,网上搜到了许多,文章内容也基本一致.而后,我将其中一篇文章中的代码挪到本地进行了测试,发现测试结果和原文中的有些出入. 我更相信自己亲自验证过后的代码,随后小记下来,供以后查阅. substr 复制代码 代码如下: document.write("|" + str.substr(0,5) + "|" + "<br />"); document.write("|&

Linux内存术语小记

整理一下内存的一些术语. 内存: 内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据.它的存取速度慢于CPU缓存,但快于硬盘.算是存储结构中的第二层. 我们的程序要运行,都需要先读取到内存中.我们所说的内存,通常指的就是物理内存,也就是内存条. 虚拟存储器: Linux使用虚拟存储器来管理内存.通过将对内存进行抽象,将其作为存储在硬盘上数据的高速缓存,只将当前进程部分代码缓存到主存中(当前进程的程序较少时,可以全部缓存在主存中),从而提

部署流水线搭建小记:Docker、Jenkins、Java和Couchbase

本文讲的是部署流水线搭建小记:Docker.Jenkins.Java和Couchbase[编者的话]这篇文章讲述了如何用Jenkins和Docker来为一个需要和数据库交互的Java应用创建部署流水线(deployment pipeline). Jenkins支持创建流水线.它使用一种基于Groovy的流水线领域特定语言(Pipeline DSL)的简单脚. 而这些脚本,通常名字叫Jenkinsfile.它定义了一些根据指定参数执行简单或复杂的任务的步骤.流水线创建好后,可以用来构建代码,或者编

【转】 Scrum 过程实践小记

严格来说,不能算是真正的scrum实践,但实践敏捷的过程本身也是一种"敏捷方法",所以就算是"敏捷实践之敏捷开发方法-scrum过程"吧. 一.理论参考:Scrum的实践(该部分摘自网络) 1.Scrum团队(5-7个人的小项目组). 2. Backlog: 急待完成的一系列任务,包括:未细化的产品功能要求.Bugs.缺陷.用户提出的改进.具竞争力的功能及技术升级等,按优先级定义出来,这些任务可能不是完整的,甚至可能随时会更改或添加. 3. Sprint(冲刺):

Jmeter性能测试小记(一)

性能测试小记(一) 1.sampler 性能测试中,向服务器发送请求.记录响应信息.响应时间的最小单元. 2.逻辑控制器 [作用范围]:只作用在线程组上 真正的控制逻辑: 控制sampler节点发送请求的逻辑顺序,比如:if,switch,Loop,Random 业务的逻辑控制: 控制业务组合,组织和控制sampler节点:比如:transaction,Throughput 3.断言 响应断言 [作用描述]:对响应体内容的判断[作用范围]: 1.仅主请求取样 (main sampler only

小记 支付宝恶搞

原文:小记 支付宝恶搞 我也记不清为什么写了这东西,不过事出必有因,昨天又有人问我要去装逼了. 先看效果图吧 确实是个装逼利器,再结合 tampermonkey 用来骗老婆骗女友一笑还是可以的. (function() { /** 支付宝恶搞 **/ function inc(el) { // 更新金额数字 el.innerHTML = el.innerHTML.replace(/\d+/, function(a) { return +a + rnd(9); }); } function rnd

js小记 function 的 length 属性

原文:js小记 function 的 length 属性 [1,2,3].length  可以得到 3, "123".length  也可以得到 3,这个略懂js的都知道. 但是  eval.length,RegExp.length,"".toString.length,1..toString.length  会得到什么呢? 分别得到 1,2,0,1,这些数字代表什么呢? 这个是群里很多新人朋友一直问的一个问题,其实函数的 length 得到的是形参个数.可以参见这

js 正则学习小记之NFA引擎

原文:js 正则学习小记之NFA引擎 之前一直认为自己正则还不错,在看 次碳酸钴,Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣.  求抱大腿,求大神调教.   之前大致有个印象,正则有很多种引擎,但我根本不知道有哪些引擎. 今天在读<精通正则表达式>才发现有Traditional NFA,POSIX NFA 和 DFA (具体自己百度下吧).可用了这么久的正则,还不知道 js 属于哪一种呢.在<精通正则表达式>里有个简单是方法检测属于哪一种. 用 /nfa|

js 正则学习小记之左最长规则

原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整个字符串 "nfa not" 的,可却只得到了 'nfa'. 再来看个例子,/an (nfa)?(nfa test)?/ 去匹配 "an nfa test",如果和上面一样的解释,那应该只得到 'an nfa',接着第一个捕获组里是 'nfa' 第二个捕获组里是空. 我

js 正则学习小记之匹配字符串

原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) var str1 = "我是字符串1哦,快把我取走", str2 = "我是字符串2哦,快把我取走"; 比如这样一个字符串,匹配起来很简单 /"[^"]*"/g 即可. PS: 白色截图是 chrome 3