距写上一篇博客已有一月有余了,看来我又变懒了。-_-!!不知不觉间,我重新回到大学校园差不多又有一个月了。这一个月里我因为一些问题而纠结过,比如入党问题;也因为有了一些收获而欣喜过。受《集异璧》的影响,我开始越来越多地思考和反省自我,以求可以突破自我,使自己更上一层楼。接下来,我将分享我在寒假和这一个月里的一些反思,一是为了鞭策自己不断进步,二是为了记录自己的心路历程。
我的第一点反思是关于内心浮躁的。寒假里,我总要坚持每天写点代码,期望自己可以在技术上有所进步,但渐渐的我发现我似乎从写代码里找不到太多的乐趣了,我似乎成了一个强迫症患者,每天都要强迫自己写代码。我感觉到似乎什么地方出了问题,却找不到症结所在。直到寒假末电脑突然出故障那几天,我才真正意识到我的心态出了大问题,我发现我心中的浮躁在疯狂滋生,甚至使我产生了一种恐慌感。这些负面的东西遮盖住了我内心中对编程的喜爱,使因为喜欢而写代码的我变成了心中浮躁心理的奴隶,心态变坏直接导致了我学习效率的下降,这便形成了一个恶性循环。也就是在电脑送修的那几天,我不断的反思自己,我重新回想了我学习编程的初始动机,我重新回味了我刚接触编程时的那种快乐,我也在寻找心中浮躁心理疯狂滋长的原因。经过一段时间的思考,我找到了一些原因。一是因为一种急功近利的心理。在查找资料的过程中,我会经常看到那些技术大牛们的故事,我会经常接触到各种我从没见到过的优秀技术和工具,这原本是一件好事,因为这使我意识到自己的不足,也使我找到进步的方向,但心中的浮躁和急功近利却使我产生了短期内成为大牛的想法,这使我在各种技术和工具中迷失了自我。二是因为没能正确处理身边的一些压力。我的家境并不好,最然我从没抱怨过,但我总有一种强烈的想要改变现状的想法,一是为了使父母过上好生活,二便可能是我心中的虚荣心作祟吧。来到大学后,本不十分优秀的我看到了很多的高手,我感受到很大的压力。本来这些压力都可以成为我勇猛精进的动力,却因为自己的浮躁成了一块巨大的绊脚石。不过,现在我的心态已经平和了许多,浮躁心理虽然并未完全消失,但已经在一种可控的范围内了,我想只要我认真对待,这份浮躁早晚会被根除。在压制浮躁的过程中,随着我对自己的反思和对一些事情的考虑,我也有了一些收获,我想这便是福祸相依吧。我的第一点收获就是:浮躁这个东西很特别,很多人都可以在自己心里发现它的影子,却很少有人能真正重视并将其彻底清除。我的第二点收获是:在这期间,我重读了很多大牛的故事,我明白了任何大牛都是一天天的努力造就的,没有人可以打破时间的约束;尤其是当我无意中读了《十年学会程序设计》一文后,心里的浮躁一下子少了不少,现在我还经常重读它,我想我可能需要二十年才能真正学会程序设计,但我会坚持到底。
我的第二点反思是关于精力和时间管理的。我一向是一个充满好奇心的人,对任何新奇的事物都有一探究竟的愿望,尤其是关于计算机的新奇事物。好奇心可以使人对一件事物充满热情,可以推动一个人不断前进,这是众所周知的事,但事实却不全然如此,好奇心如果处理不当也会产生负面影响,一个人完全被好奇心驱使的话会是一件很可怕的事。当我在反思自我的时候,我开始意识到我已近被好奇心驱使了,我看到计算机领域的无数新奇事物,尤其是当我接触到Linux以后,我知道了Latex、mutt、coreutils、FVWM以及其他各种工具,我开始疯狂使用各种工具,但却没有一件深入学习的,我不断的在各种工具之间流连,尝试各种新奇的工具,这使我浪费了大量的时间却没有真正的掌握任何一种工具,这种精力的分散导致我一事无成。同样的事情也同时出现于我和互联网之间,作为一个程序员,上网查资料、看博客、询问问题很常见,我也经常如此,而且作为一个菜鸟,我的关于编程的问题还是非一般的多,这使我经常在网上搜索资料。渐渐的我发现互联网这东西虽然好用而且离不开,但是它在分散精力方面的能力也是一流的,有很多次我都是在找资料的过程中忽然在网上看到一些新奇的东西,于是就点开了链接,接着我又点开了下一条链接……直到我看了看时间,发现已经过了很久后我才依依不舍的关闭了浏览器,到最后我甚至都已经忘记了我原本要查什么问题,囧。看博客的时候这种状况更为明显,我经常会顺着友链一直点下去、点下去……跟一只网络爬虫似的。经过多次的这种精力分散后,我意识到这样下去是不行的,我决定采取以下方案:一.工具的学习要有主次之分,学好一样再学下一样,当前的目标便是把linux的各个方面都熟悉了;二.限制使用互联网,但不隔绝互联网,程序员是离不开互联网的,但我觉得互联网还真没有人们想象中的那么重要,至少对我而言阅读大牛们的著作并实践之要远比在互联网上搜索各种零散知识要来的踏实、重要。三.我要开始学习时间管理的方法,如GTD。每个人的时间都是相同的,只有将这些时间充分利用了才可以创造出更多的价值,鉴于我患有多年不愈的拖延症,时间管理是必须学习的。徐宥曾经写过名叫《完全用命令行工作》的系列博文,这些博文对我触动很大,这让我思考当前我使用电脑的主要目的是什么、我是否也可以脱离鼠标,最后我得出的结论是:对我而言,大多数时候我不仅可以脱离鼠标,甚至连GUI界面都完全不需要使用!由此我产生了将xwindow的随机启动取消的想法,只要掌握了screen的使用,在纯命令行我也可以完成我的几乎所有工作,因为当前我使用电脑的主要任务几乎只有学习编程而已。
反思不是我的目的,而是一种鞭策自己进步的手段。不时地反思一下自己,及时的调整一下方向使使我有可能持续进步的良方妙药。但是无论反思得有多么深刻,不去改正也是枉然;无论改正措施多么完善,不去执行便都是空谈!我要加油了,要不然恐怕二十年都学不会程序设计吧。
不知不觉间2011已经过去一段时间了,回想已经逝去的2011,我的确是感慨万千。2011年,对我来说的确是不太平凡的一年。在这一年里,我经历了一些重大的改变,这些改变既有顺理成章的,也有非常突兀的;既有现实方面的,也有思想方面的。我也不知道这些改变对我来说究竟是好是坏,我也不知道我究竟是在走向成熟、偏执还是其他的方向。总的来说:2011年是迷茫与理想同在的一年,是令我终生难忘的一年。
2011年,我由高中进入了大学。1年上半年,我坐在略显拥挤的高三教室里奋笔疾书,整个教室都弥漫着一种凝重的气息,2011年上半年,我坐在略显拥挤的高三教室里奋笔疾书,整个教室都弥漫着一种凝重的气息,同学们都在努力着,大家都积蓄着一股干劲要往前冲,那时我的想法十分单纯:到大学就好了,到大学就可以无忧无虑的学自己想学的课程了。现在想来当时的想法真是可笑之极!不过高三的生活虽然十分地艰难,但现在想来却也是别有一番滋味在心头,那种在黑暗中追寻一缕曙光的感觉实在是令人难以忘怀。转眼间往日的同学都已各奔东西,大家都追寻自己地生活了,前几日高中同学聚会,大家才又聚在一起,没有了高考的压力,大家在一起闲谈高中往事和各自的大学生活,这真是令人十分愉悦的事,遗憾的是人最终还是没有来齐。转眼间,我进入大学已有半年,说实话,我的确对自己的大学生活感到失望,大学的不自由、课程的不合理、授课的乏味、各种活动的干扰都令我感到失望,整个大一上学期我一无所成,课程上仅仅是保持没有挂科罢了;同时,对大学生活的失望也使我产生了颓废的情绪,但心底地追寻理想的信念却又不允许我这么颓废下去,这也使我纠结万分,不过最终我还是站起来了,虽然此时大一上学期基本已经结束。我收拾心情开始复习,仓促的复习使我得以暂时脱离挂科的危险。在这次改变中,我终于意识到理想与现实总是存在差距,但我们却不能放弃对理想的追求。虽然大学里我选的是我非常热爱的软件专业,但学校的课程确实令我失望无比,一开始这对我是一个巨大的打击,后来我阅读了一些大牛的博文,并且开始渐渐地意识到大学老师能教给自己的知识其实很有限,自学才是真正适合我的成长之路。
2011年,我开始了真正地尝试着自我思考。在我尚未进入大学时,我一直是一个十分没有主见的人,也很少去思考学习以外的事,这就导致我思想上的极端幼稚,进入大学后一时有些难以适应。我所在的大学在成都,离我的家乡有相当长的一段距离,我自然也无法从父母那里获得及时的“援助”,虽然有电话,但在电话里一时还是无法将具体的情况说清。这就迫使我不断的去思考、选择,在这期间我也慢慢地变得有主见,虽然在这点上我还欠缺不少,但我还会继续努力。另一方面,对大学生活的失望虽然令我有些颓废,但也使我不断地思考自身,我渐渐的开始进入了自己的内心,我开始思考一些我从未思考过的问题,我开始不断地问自己:你究竟想成为什么样的人?你的理想是什么?你是要为理想也奋斗还是心怀不甘地颓废下去?还有其他很多的问题,我一次次的站在路口,一次次的问自己,一次次做出选择,这其中有正确的,也有错误的。就这样,我渐渐地成长着。“我曾多次站在人生的十字路口,我也深知哪条是正确的路,但我却从来没选择那条正确的路,因为那太苦了!“看电影时偶然看到了这句台词,从此便深深地爱上了这句话,我希望我可以一直选择正确的那条路,遵从自己的内心的选择。
2011年,我在迷茫中找到了前进的方向。填写志愿时我毫不犹豫地填写了软件专业,但那时的我对软件也几乎是一窍不通,我只是有过少许编程的经历,觉得编程很有趣罢了。暑假里,我开始了软件方面的自我学习,逛论坛、找QQ群、找专业博客、写简单的代码,这时我真正地爱上了编程,即使我从网上了解到国内的程序员的生存环境不太好的现状我也没有太大的动摇。学习软件给我打开了一扇宽广的门,让我的知识面更加宽广,让我见识到世界各地的科技的繁荣。暑假的日子是快乐的,没有了高考的重压,我经常一边写代码一边憧憬着大学的美好生活,暑假就这样很快过去。我前面也说了,来到大学时我真的很失望,不仅仅是因为对大学生活的不适应,更多的是对软件学院的一种失望,不允许带电脑、没有一个像样的实验室、学习气氛不浓等等。说实话,大一上我基本没写过太多的代码,我甚至觉得这一个学期我在软件方面的进步还不如暑假在家自学时的大。这一切都令我感到迷茫,我似乎找不到自己的方向了。但有时迷茫也是一剂良药,正如Jobs在离开苹果后意识到苹果对他的重要性,我也发现了编程对我的重要性。编程带给我的不仅仅是一种程序正确运行后的欣喜和成就感,还带给我心理上的淡然和享受。我真正懂得失去后才知道珍贵的道理。我就这样坚定了我的理想。
大一上学期我学业上的进步微乎其微,这的确是一个遗憾,但我却在这遗憾找到了我自己的路,也算是有所收获。很快又要回到大学校园了,在这2012——“世界末年”——里,我希望自己可以取得长足的进步,无论是思想还是编程。我的表达能力一向不好,从这篇文字也可以看出一二:表达不太清晰、思路不够完全…在2012年,我将坚持把博客写下去,一是为分享自己的成长历程,二是锻炼自己的书面表达能力。
不知不觉间,玛雅预言中的世界末年——2012年已经来到你我的身旁,大家现在都还好么?已经逐渐远去的2011对我来说的确是有重大意义的一年,在2011年我经历了太多太多,以至于我一时都无法说清,我会专门写一篇博文来纪念已经逝去的2011。不知道大家的2011又是怎样的一种情况呢?过去的2011里,有痛苦,有喜悦,有感动,有喜悦,还有很多很多…… 2011终究已经过去,在这里我送上一个迟来的祝福:新年快乐!无论末日是否到来,都希望大家可以有一个快乐幸福的2012.
今天,我们来介绍变量。接下来,我将通过两个非常简单的例子来说明。注意:这里的两个例子也将会在以后几篇博客中用到。 首先,我们来看下面两个例子。 程序一:
#include <stdio.h>
int main(void)
{
int sum, num;
int min, max, step;
min = 0;
max = 100;
step = 2;
num = min;
sum = 0;
while (num >= max)
{
sum = sum + num;
num = num + step;
}
printf("the sum is %d.\n", sum);
return 0;
}
程序二:
#include <stdio.h>
#define MIN 0
#define MAX 100
#define STEP 2
int main(void)
{
int sum = 0;
int num = 0;
for (num = MIN; num <= MAX; num = num + STEP)
{
sum = sum + num;
}
printf("the num is %d.\n", sum);
return 0;
}
一.变量的声明
变量,顾名思义,就是可以变化的量,任何一个稍微有点用的程序都离不开变量。由于在C语言中,所有的变量都必须“先声明,再使用”,所以我首先介绍下变量的声明方法。请看程序一中的main()函数中的前两条语句: int sum, num; int min, max, step; 这两句简单的体现了声明变量的通用方法。变量的声明由类型名和变量名这两部分构成。上面两句中的int就是类型名,而sum、num等就是变量名。 1.数据类型 类型名说明了变量的数据类型,而数据类型则说明了一个变量在内存中所占空间的大小、在内存中的存储方式和这个变量可以进行的操作。同时C语言也是一种对数据类型要求比较严格的语言,所以对程序员来说选择适当的数据类型是完全必要的。适当的数据类型不但可以节省内存空间,而且可以减少操作时间。C语言中主要有以下几种数据类型:
char 字符型,可以存储*, &等符号,占一个字节
short, int, long 分别是短整型、整型和长整型,用来存储整数,它们的大小由你所使用的机器决定,但是它们的大小必然满足以下规律:short ≤ int ≤ long(char ≤ short)。
float, double 分别是单精度浮点数和双精度浮点数,用来存储实数(可以带有小数点),它们的大小和存储方式都由机器决定。
unsigned 它可以与上面三种整型类型名同时使用,用来定义只能存储非负整数的变量
作为一名程序员,知道你所使用的平台的不同数据类型的大小是一项基本功,它有利于你写出正确且高效的代码。要想准确知道你所使用平台上的数据类型的大小,可以阅读limits.h这个头文件。 2.变量名 变量名其实只是一个符号,在符合规范的前提下可以任取,对编译器而言名字的长度、含义的清晰与否等没有影响。但是,在写实际的代码时,所有的程序员都十分看重代码的整洁和清晰,因为你写出的代码主要是为了让其他程序员也可以比较容易读懂。尤其是在 大项目,个人的力量有限,必须要多人一起合作,此时代码的清晰就异常重要了。而变量名的选取则是增强代码清晰度的一个很重要的方面。所以,一个有意义的变量名是十分重要的。
二.变量的初始化和赋值
一个变量如果要发挥它的作用,自然要有值,而且这个值还要有意义,那么该如何让变量获得有意义的值呢?我们有两种方法可以实现,分别是初始化和赋值。
1.初始化
变量的初始化是指在声明变量的同时就让变量拥有了有意义的值。如:
int sum = 0; int num = 0;
这两句就是典型的初始化语句。那么没有初始化的变量是否有值呢?让我们看一下下面的代码及结果吧。
代码:
#include <stdio.h>
int main(void)
{
int initial = 100;
int uninitial;
printf("initial=%d uninitial=%d\n", initial, uninitial);
return 0;
}
由上我们可以看出,无论变量是否进行了初始化,它都会有一个初值;同时我们也看到初始化后的变量的值是我们确定的,而没有初始化的变量的值是一个不确定的随机值。
2.赋值
除了初始化外,我们还可以通过赋值的方式来使变量获得有意义的值。变量的赋值有多种形式,如:
min = 0;max = 100;step = 2;
sum = sum + num;
以上都是赋值语句,我们可以看到对变量赋值时,既可以直接赋给变量一个现成的值,也可以在 "=" 后跟一个表达式。我们在赋值时应当注意不同数据类型之间的转化,下面代码只是其中的一种情况。 代码:
#include <stdio.h>
int main(void)
{
int int_num;
float float_num;
int_num = 3.987;
float_num = 256;
printf("int_num=%d float_num=%f\n", int_num, float_num);
return 0;
}
可以看出,将浮点值赋给int变量时小数部分会被直接省略,而不是四舍五入;同样的整数赋给float变量时也会自动转化为float型。 今天就说到这里,水平有限,欢迎指出不足之处。
#include <stdio.h>
int main(void)
{
printf("Hello world!\n");
return 0;
}
程序相当之简单,但作为第一个程序(程序员对第一个程序应该是有特殊感情的吧?),还是有不少东西可以说的。下面我将一一道来。 首先,我们应当知道C语言编写的程序是由一个个函数组成的,如上面代码中的main()和printf()。C语言中的函数是VB中的过程和函数的综合,关于函数的知识将在以后详细解释。接下来我来详细解释下这个程序。第一句是文件包含命令,它的作用是将stdio.h中的内容包含到源文件中,这里涉及到函数声明的知识,以后再作解释。那stdio.h是什么呢?原来是由于C语言当初设计时就十分简单,甚至都没有提供输入输出的功能,所以后人只好自己编写这些函数了,并且将同一类函数放到一个“库”中,这个stdio.h就是一个库。说白了,库就是一堆具有相似用途的函数的集合。由于这些函数功能简单但是用途又十分广泛,于是C语言标准中就引入了一些标准库,像stdio.h就是标准输入输出库。当然我们也可以自己编写库。接下来说下第二句中的main()函数,main()虽然也是函数,但是它的地位十分独特。一切C语言程序都是由main()函数的开始处开始运行,到它的结尾处结束。main()就像是一个统领全军的元帅,而其他的函数就是他手下的将军和小兵。紧跟在main()下的一对大括号就指定了main()函数的范围。这句中的int和void也会在讲解函数时一起说明。这里不得不说一下main()函数的形式问题:在C语言标准中只定义了int main(void)和int main(int argc, char *argv[])两种标准形式,虽然标准中并未禁止void main()等形式,但最好还是不要使用,毕竟编程是一件要遵循标准的事。接下来的printf()当然也得说一说了,看名字我们也猜得出它的功能:打印字符或语句到屏幕上。而Hello world!\n就是要打印出的语句,我们实验后可以看到只输出了Hello world!那\n是什么呢?其实这里的\n叫做转义字符,它的作用就是换行。同样也好有其他一些转义字符,比如\t代表制表符(TAB),这些转义字符一般书上都有详细说明,这里不再赘述。大家应当都注意到句末的分号了吧?在C语言中分号标志着一条语句在此结束,所以分号不能忘记打,也不可以乱打(我刚开始时就经常忘记- -!)。最后的return 0; 一句则代表着main()函数将数0返回给了操作系统,这里的0说明程序正常退出了。 到此为止,第一个程序讲解完毕,如有遗漏或错误之处欢迎指正。水平有限,让大家见笑了。 资料来源:《The C Programming Language》


