母亲节快乐!
吃遍天下盐好,走遍天下娘好!祝天下母亲都健康快乐!
妈妈虽然您从不上网,不可能看到这里的话,但我还是在这里对您说,我爱您!
祝博客的母亲们节日快乐,特别祝老犁的母亲节日快乐!
大家可以回家的回家啊,不可以回家的就打电话吧!
母亲节快乐!
吃遍天下盐好,走遍天下娘好!祝天下母亲都健康快乐!
妈妈虽然您从不上网,不可能看到这里的话,但我还是在这里对您说,我爱您!
祝博客的母亲们节日快乐,特别祝老犁的母亲节日快乐!
大家可以回家的回家啊,不可以回家的就打电话吧!
第三章 语义陷阱
3.1指针与数组
C语言的值得注意的两点
1.C语言只有一堆数组,而且数组的大小必须在编译期就作为一个常数确定下来。因为数组中的元素可以是任何类型的对象,因此也可以是另一个数组。所以多维数组就是这样“仿真”来的。
2.对于一个数组,我们只能够做两件事:确定数组的大小,以及获得指向该数组下标为0的元素的指针。其它有关数组的操作都是通过指针进行的。
*a是数组a中下标为0的元素的引用。*(a+1)即是数组a中下标为1的元素的引用。*(a+i)即数组a中下标为i的元素的引用。而a[i]是上面写法的简记。因为a+i和i+a的含义一样,所以a[i]和i[a]是同一种含义!
对于二维数组 int a[10][13],a则是“数组的数组”。声明指向a的指针的话需要这种形式:int (*p)[13]; 但对于二维数组最好还是使用下标的形式!
3.2非数组的指针
在C语言中,字符串常量代表了一块包括字符串中所有字符以及一个空字符(‘\ 0’)的内存区域。因为C语言要求字符串常量以空字符作为结束标志。
strlen函数返回的字符个数并未包括空字符,因此在用malloc和strlen结合分配内存时需要加上一个空字符。类似这种状况:
malloc(strlen(s)+1);
3.3作为参数的数组声明
将数组作为函数参数毫无意义,C语言会自动地将作为参数的数组声明转换为相应的指针声明。
int strlen(char s[]){ }与 int strlen(char *s){ }写法相同!
int main(int argc,char **argv){}与int main(int argc,*argv[])等价,但前者强调argv是一个指向某数组的起始元素的指针,该数组的元素为字符指针类型。
3.4避免“举隅法”
举隅法(synecdoche)以含义更宽泛的词语来代替含义相对较窄的词语,或者相反。
名词就解释完了,这里只要记住一条:复制指针并不同时复制指针所指向的数据!
3.5空指针并非空字符串
//这节好像没什么东西好记!
#define NULL 0
3.6边界计算与不对称边界
关于边界问题也是我经常犯糊涂的问题,今天看了有些收获!
用第一个入界点和第一个出界点来表示一个数值范围。下界是入界点,包括在取值范围之中;上界是出界点,不包括在取值范围之中。这叫不对称边界:
1.取值范围的大小就是上界与下界之差。
2.如果取值范围为空,那么上界等于下界。这是第一条的直接推论。
3.取值范围为空,上界也永远不可能小于下界。
对于问题:整数x满足边界条件x大于等于16且x小于等于37,那么此范围内x的可能取值的个数是多少?//此博客中好像不能出现小于号,因此用文字代替。
下界是16,包含中!上界是38,38是不包含在其中的。因此用上界减去下界38-16=22 因此可得出答案是22。方便快捷!
对于数组buffer[N],&buffer[N]是一个地址,C语言中引用这个无效元素的地址是允许的,可利用于本例中的不对称边界原则,但引用该元素则是非法的! //这个不对称边界原则在STL中也有应用!
3.7求值顺序
C语言中只有四个运算符(&& || ?: ,)存在规定的求值顺序。而其它运算符对其操作数求值的顺序是未定义的,特别地,赋值运算符并不保证任何求值顺序。因此,在编程中不要对求值顺序作假设!
3.8运算符&&,|| 和 !
3.9整数溢出
注意有符号数的计算!
3.10为main函数提供返回值
这个不用说了,gcc已经明确要求main要返回值!
毕业就是失业!
早听过这句话。但一直不知道是什么味道。现在知道了!
百来次的投递简历,十数次的面试机会。一次又一次的失望。看着身边的同学已然在工作了。自己还是没日没夜地泡在网上。很多时候都明白,把自己逼入这窘况的恰恰就是自己。
有时候也想过当初不读大学来得更好一些。找一份小的工作,起码可以安贫乐道。而花了四年的时间和金钱在大学上,在里面学会了吃喝玩乐。从QQ到论坛,再从论坛到博客。自己大部分时间都浪费掉了,换言之,我是在自杀啊!好多道理都明白,可是却总是不能制止自己的坏习惯。
记得快高考的那时候,也是常悔恨自己没有用功学习。想到如果没有考上大学,后果就会很可怕。对未来充满了恐惧。情形和现在一样。都是想到六月份以后不知何去何从。
想到这就不知所云,胡言乱语。
给Linux初学者说清的几个问题.
1.上QQ好麻烦。
腾讯封闭自己的协议,并且只出win的版本。默认是不支持其他平台的。现有
的一些Linux下的QQ工具都是开源社区里的爱好者自己开发出来的,虽然还没有
官方版本好用,但还是值得推荐。如:eva(kde下的QQ),LumaQQ(Java版本的QQ)
gaim-openQ(比较老的QQ版本,用的是2003协议),cyclone(迷失中的基于gtkmm的
QQ版本)
2.不能看word,
word是MS的专有格式,其他的软件是不可能完全兼容的。openoffice可以看,
格式会有些少变化。
3.不能玩游戏。
游戏厂商一般只推出win版本的游戏!然而现在也有好些大型的游戏借助一些模拟
API(如wine)可以运行在Linux平台下!如CS,魔兽等。一些在线的休闲游戏
并未能支持非win平台,如中游,QQgame等。这种情况只能等待改善,跨平台的
在线游戏也是有的了!如北京的蓝迪!如果你真的是很喜欢游戏的话,那就去装
一个win吧!
4.没有驱动。
这要怪你的硬件开发商了,问他们为什么只提供MS平台的驱动。没有专用的用
通用的驱动也可以!
5.有些网站显示不正常?
这样网站使用了一些IE Only的技术,只有用IE核心的浏览器才能正常浏览。
一般这样的网站都是不符合W3C标准的。
6.没有Photoshop,Dreamwave,Flash MX等等
Linux下的Gimp有着Photoshop相同的能力,软件功能相似,但现在是习惯问题吧!
既然你已经选择了Linux来代替Window,那也可以试着用Gimp来代替Photoshop。
只有当你完全了解Gimp之后再和我说Gimp不如Photoshop之类的话。Dreamwave,
Flash MX等还没有Linux的版本,相应的替代软件也不如他们功能强劲。还是那句
话:情况会改善的!当然这类软件是可以用wine模拟的!
7. 安装软件好麻烦。
选择一下好的版本,一个好的软件包管理器,一个好的软件包镜像站点,安装软件
也只会是鼠标点点而已!如Debian下用新立得软件管理器。
8. 默认字体不好看。
Window里的simsun字体是有版权的。在国内也几乎没有一款可以免费使用的可观性
高的字体。因此开源社区才有了文泉驿项目。这一点要柯责我们的政府,一直声称
支持Linux,把钱扔给一些国产Linux公司,却不曾想过为广大Linux版本解决字体
问题。购买一款字体然后令之开源,让广大开源社区可以免费使用,这样的成本绝
对是小事一件。台湾和香港早已经有免费可用的GPL的字体。(香港政府自己购买了
一款字体然后开源)
9. 没有杀毒软件。
杀毒软件是有的,clamav是一款免费的杀毒软件。就现阶段来说安装杀毒软件还不
是那么迫切性,当然有备就无患了!
10. 乱码!
一般安装上的Linux默认编码都会是utf-8,而window上是GBK。这两种编码是不兼
容的。因此在两台机器共享软件的时候就会产生乱码问题了!
11. IDE问题!
你是说开发环境没有IDE吗?Unix下有另一种哲学,VIM+CTAG+GCC+GDB等。当然
现在Linux下也发展出许多IDE,如Kdevelop,eclips等。
12. 下载管理器!
Linux的确没有太多能比得上flashget这样的下载管理器。值得推荐的是D4X,界面
与flahget类似。一般用文本界面下的下载工具能得到更快的速度,如proz,一般
我都开二十线程来下载。流媒体之类的下载还没有成熟的工具。现在win下的人已
经不多用flashget了吧,大多改用迅雷了,我想提醒你在用迅雷的时候,你是清楚
地知道自己在某些时候是在盗链的。
13.内存问题!
大多数从win转到Linux下的人对Linux抱怨的第一件事就是Linux使用的内存太多了!
这绝对是个误解!对于Linux来说内存其实没有一个绝对数!因为Linux可定制为最
小装在一个软盘上!那这样使用的内存是多少呢?当然这样说是没有可比性了!那就
拿一般的桌面系统来比较吧!这里仍然是存在着误解的!一个256M的内存,在Linux
开机后用free看看就没剩多少了!Linux使用内存的机制和Window不同,它会将多余
的内存拿作I/O的缓冲,因此大家用free看内存的时候请使用公式 :
used - buffers - cached
结果就应该是相当你在window下用的内存数了!
14.gnome还是kde?
一些人在选择Linux作为桌面时对这两种桌面系统感到彷徨,不知该选择那一样?
gnome是基于gtk的桌面,而kde是基于QT的桌面!基本它们各有特色!各有一大批
爱好者和优秀的开发者!如果你有时间可以都试试,然后选择自己喜欢的!或者让
你的发行版本帮你选择。一般发行版都有默认的桌面系统。当然如果你还不满足,
或者对效率敏感的话,可以试试其它的方案!如fvwm,xfce,icewm,e17等。
暂时想到这么多!
博客受垃圾留言骚扰
这几天发现自己的博客被垃圾留言盯上了!没多少分钟就有一留言,留言内容大致是:
Nice! Keep up the good work!
I love it!
Nice post! Many thanks for your work.
Very useful and interesting site, thanks!
Very good article.
大致出自blogs.eurosport.fr网站,现在有升级,http://s3.invisionfree.com/等等 也有了!
暂时还不知道究竟是怎样回事,只有将以上的留言变为关键词过滤掉!
留言的网址最后是指向一个卖药的网站的,donews的其它用户也受到了类似的骚扰!
经常受骚扰的确是烦人的事,现在真的是垃圾满天飞!
忆故居 —陈寅恪
渺渺钟声出远方,依依林影万鸦藏。
一生负气成今日,四海无人对夕阳。
破碎山河迎胜利,残馀岁月送凄凉。
松门松菊何年梦,且认他乡作故乡。
这是陈寅恪先生在1945作的一首诗,很多人都很喜欢他那句“一生负气成今日,四海无人对夕阳”。我也很喜欢!
第二章:语法陷阱
2.1理解函数声明
int f,g; 声明f,g的类型为整型.
int ((f)); 当对((f))求值时,((f))的类型为整型,由此可推知f也是整型。
int *pf; 这个声明中,*pf是一个整型数,所以pf是一个指向整型数的指针。
int *g(),(*h)();
对于*g(),因为()的优先级高于*,*g()就是*(g());令pf=g(),则*g()就是*pf,整个表达式变成 int *pf; 因此可知pf 是一个指向整型数的指针。由此可知对g()的求值结果是一个指向整型数的指针,也就是说g()的返回值是指向整型数的指针。最后得出,g是一个函数,该函数的返回值类型为指向整型数的指针。
对于(*h)(),令pf=(*h),则 pf() , 很明显看出,pf是一个返回值为int的函数。即*h是一个返回值为int的函数,因此h就是这个函数的指针,即h为返回值为int的函数的指针。
int (*h)(); 表示h是一个指向返回值为整型的函数的指针,因此:
(int (*)()) 表示一个“指向返回值为整型的函数的指针”的类型转换符。
假定fp是一个函数,调用fp所指向的函数为: (*fp)();ANSI标准允许程序员将上式简写成fp()。但要记住这只是一种简写形式。
*fp()实际上与*(fp())的含义完全一致,ANSI C把它作为 *((*fp)())的简写形式。
(void (*)()) 0; 将常数0转型为“指向void的函数的指针”类型。
对于 fp(),可变成:(*(void(*)()) 0)();
//有点玄而上学了!
2.2运算符的优先级问题
这个问题在第一章的时候提了一下!现在举个自己的例子!
r=hi>>4+low ;
我曾经天真地认为hi会先右移四位然后才和low相加。但错误狠狠地教训了我!这个表达式的顺序是hi右移了4+low个位。”+“的运算符的优先级大于“>>”的优先级!
具体的就不说了!记住下面两点:
1.任何一个逻辑运算符的优先级低于任何一个关系运行符。
2.移位运算符的优先级比算术运行符要低,但是比关系运算符要高。
另加自己的一条:如果不确定运算符的优先级,那就给你想先执行的语句加上括号!方便阅读并且保险!
2.3注意作为语句结束标志的分号
(1) if(x[i]>big);
(2) big=x[i];
注意,第二句和第一句的if没有关系!因为第一句的if之后有了一个分号,表示if语句判断之后执行了一个空语句。然后到了第二句!
再来看看少了分号的情况!
if(n>3)
return
logrec.date = x[0] ;
logrec.time = x[1];
程序原意是n大于3时就返回!但在return后面少了一个分号,程序就变成了n大于3时返回logrec.date的值了!
struct logrec{
int date;
int time;
int code;
}
main()
{
}
在这里,结构体后面少了个分号,程序变成了main函数的返回值是上面据说的结构体!这些都是不得不注意的问题!
2.4 switch语句
switch后面的case会顺序执行,因为C语言把case标号当成真正意义上的标号,程序的控制流程会径直通过case标号,而不受到任何影响!因此需要在每个case后面加上break来退出执行流!
2.5 函数调用
C语言要求在函数调用的时候即使函数不带参数,也应该包括参数列表,因此,如果f是一个函数:
f(); 是一个函数调用语句,而
f; 是一个什么也不做的语句,这个语句计算函数f的地址,却没有调用这个函数!
2.6 “悬挂”else引发的问题
没啥好说的,注意if和else的对应问题就可以了!写代码的时候注意好缩进能比较好地防止这个问题!或者是即使没有else语句对应的if语句也写上去,只为了对应,写上去的else执行空语句就可以了!
今天和老犁还有他同学一起去了中大,参加了那个开源文化节。
人倒是挺多的,机器也多!见到了中大的网友阿俊。还见着了老犁的两位老师,他们很好人啊,也很好聊。一开始就送了我们一人一张餐巻。这样解决了吃饭问题,后来还帮我们一人搞了一件文化衫!真是好人啊!还说给老犁一个服务器,去镜像Linux。我学校有这样的老师就好了!哎,老犁,你可要好好珍惜啊,说那个服务器哩!呵呵!
文化节里有两个比赛,一个是桌面擂台。一个是设计的。设计的那个比赛有五千元的奖金啊,可惜是一早报好名的,老师带着队去参加的!题目也有些难度的!我想我也未必能全完成!那个桌面赛就随便一点了,我们中途报了名。其实就是比谁系统装得快!系统由你选。晕!我选了个红旗,谁知中标装得更快!老犁得了第三名,有个512U盘,我是第七名,呵呵!其实挺喜欢七这个数字的!没名次还有礼品拿嘛,是个耳机。回来一听,其实效果差得很!算了!也有点玩嘛!
回来的时候下了大雨,还遇着一个华工的MM问路,(老犁博客有说这件事)竟然说是想去春之花(偶大学里的一个零食店)!
faint!
其实偶倒是很在意一开始在公交站上的一个MM,偶第二次看见她!她好像也认得偶~~
今天还是很高兴的,很久没这么开心了!
列出自己常用的Linux程序,排名不分先后:
1.浏览器:firefox, mozilla
2.rss阅读: liferea
3.电子书阅读:gpdf, acrode reader,chmsee,man
4.音乐播放:xmms,rhythmbox,mpg321,ogg123
5.视频播放: Mplayer,Xine,realplayer,totem,oxine,gxine
5.编辑器: vim,leafpad,gedit
6.软件包管理: Apt,dpkg,synaptic(新立得软件包管理器)
7.博客工具:Blogtk
8.聊天工具:cyclone(QQ client by gtkmm),eva(QQ client for kde),gaim(用于MSN,Jabber)
9,邮件工具: mutt + fetchmail + procmail + esmtp
10.游戏: xmame(街机模拟器),连连看,supertux
11.窗口管理器:Fvwm
12.图像处理:imagemagic,gimp,gqview,qiv
13.网络下载:gftp,lftp,proz,d4x,wget,azureus(BT工具),gtk-gnutella(音乐P2P)
14.终端:mlterm + screen
15.中英文学习:stardict(星际译王),reciteword(黑客学单词)
16.思维工具:freemind
17.输入法:fcitx
博客的一个作用
发现csdn的博客通常都是将博客用来作读书笔记的!我也发现这样做是有些好处的,起码可以提醒自己要记得看书。(我总是看一半就没看下去)并且看完的的书的章节做些笔记是对记忆很有用处的事情!之后回来看,无论写了些什么都总会因此而想起当时的记忆。这的确是件不坏的事情。因为人的记忆其实是很不可靠的东西,因此做笔记是很有必要的!另外也可以为博客充充数!呵呵!
新建了读书笔记这个类别,主要是针对自己的!