C语言剖解(07)
是的,我的确讨厌对着书本念,我也尽量的避免念书,经常念书,必然会引起学生的反感,书都有在自己手里,你念一遍和我念一遍,哪个更好?肯定是学生自己念书本的效果更好了,否则也不至于有:风声雨声读书声,生生入耳之说了。因此,一个经常按书本念的老师,不是个好老师。
但,从不按书本讲的老师,那也不是好老师。试想一下,你漫天的讲,学生听得就算口水都流出来了,可最后会突然发现,除了侃大山,其实什么也没讲。
矫枉过正,我不能这么做,所以,尽管我喜欢聊天,尽管我喜欢吹牛,但吹牛也是有限度的。
第三章的课,我分为三个课时来讲每个课时一小时。这就要有所次重点了,即有所讲,有所不讲,有所延伸,有所不延伸。当然,我还需要有耐心。
因此,讲数据间的混合运算的时候,我只说了四句话。
1、 C语言是强数据类型语言,不允许各类型数据之间进行转换。
2、 你如果非要进行数据的混合运算,必然会牵扯到隐式类型转换,当然,也会埋下隐式类型转换的隐患
3、 如果你想避免隐式转换的隐患,那你就明确数据类型间的转换,即强制类型转换。
4、 在不越界的情况下,我们注意同类优先级的数据书写方法,碰到乘除运算,我们一定要先乘后除。
第一点,我不消去多做解释;第二点,我会举一个很简单的例子,这个例子,就是书中的例子:10+ ‘a’ + i * f –d / e;
而对i 和 f d e 的定义,我是如下定义的:
float i = 1.5;
float f = 8.7654;
double d = 3.14;
long e = 1234567890;
我会逐步添加括号。来逐步阐述隐式类型转换的原则:小数据碰到大数据,就会隐式的转换为大数据,但同一种数据类型之间,不会进行转换。进而引出第三点,强制类型转换的必要性。我也举例说明,强制转换我们要遵循的原则:最好不要将大字节类型的数据,转换为小字节类型的数据。
至于第四点,其实目的也是为了消除第二点的隐患。比如;
3 / 5 *5的结果是0;
而 3 *5 / 5的结果是3;
但在正常的数学运算中,我们两种方法得出的答案都是3;
而对于算术运算符和算术表达式我是这么讲的。
“将书本翻到P365也附录C,这个需要记忆”,记什么?
“记运算符的目数,优先级和结合方向。”怎么记?
“多多练习。”
除此之外,我会强调一下/ 和 %;这里需要注意什么呢?
我举如下例子,并分别让学生给出结果:
Int I = 7 / -2; ------à -3
I = -7/2; ------à -3
I = -7 / -2; ------à3
I = -7 % 2; ------à-1
I = 7 % -2; ------à1
I = -7 % -2; ------à-1
很显然,求商(即’/’)运算和取余(即’%’)运算的情况很不一样。取余运算只和分子有关。
接下来我直接讲解自增(++)、自减运算(--)。我给一口气给出如下例子:
int i = 2, j = 3;
i = j++ + 2; i=5,j=4;
j = ++i + 3; i=6,j=9;
i = i++ + ++j; i=17,j=10;
j = ++i + ++i + ++i; i=20,j=58;
i = ++i + i++ + i++; i=65;
当然,只给出结果,读者难以理解为什么,想要真正理解这些,最好跟一下汇编代码,通过上面给出的内容,无非是想告诉学生,千万不要像上面的方法去写代码,如果不幸遇到某个公司这样的考试题,那么我们根据如下两个原则进行求值:
1、 编译器是个贪心的家伙,每次编译的时候都是尽可能多的包含运算符号;
2、 操作数必须为左值,因为++表达式本身在C中不能做左值,单前++在C++中可为左值。
当然,如果我们自己写,那么请你还是加一些必要的小括弧’()’吧。
而对于赋值运算符和赋值表达式,我通常只讲一两点:
1、 表达式本身是有值的,值为赋值后做操作数的值。
什么意思呢:即:printf(“%d\n”,b = 7);这句话会打印出7来。
说明 b = 7本身就是有值的。
2、 不同类型间的赋值,遵循如下原则:
短类型 = 长类型; //高位截断
长类型 = 有短类型;//符号位扩展
长类型 = 无短类型;//高位补零
这地方,我就不举例子了,给学生一个看书的机会,我所做的,就是简单的把一些谭浩强所讲的东西概括一下。
我最怕一个问题,就是学生参加完笔试回来,我问他做的怎么样,他们说:“您讲过的我都做出来了,有些你没讲过,所以我没做出来。”这样的回答相当有才。所有责任瞬间归到老师那里了。遇到这样的事,我一般会这样回答:
“如果我只教你吃鱼肉,你是不是就不知道吃张嘴吃羊肉了?”
玩笑归玩笑,懒惰的心理可不能有,看官可否明白了?如果你是指望跟着我的文档学习的学生那么,你要动手做一下,并翻一下谭浩强的书,我说了,我这些文章,是以谭浩强的《C程序设计》为教材的。没有的话,那就想办法弄一本咯,但千万别偷偷捡走别人的哦。
如此废话一堆之后,我们剩下第三章的最后一小姐了,错了,不是小姐,是小节。那就是逗号表达式。呵呵,也很简单哦,两句话。
1. 逗号表达式的值是最后一个逗号后的表达式的值
3+4,5+7 //这个表达式的值是12
2.由于逗号运算符的优先级低于赋值,所以
a=3+4,5+7;
a的值不是12,是7。
怎么用程序模仿出来上面两个条件的内容呢?如下所示:
int a;
printf("%d\n", a = (3 +4, 5 + 7));
printf("%d\n", a = 3 +4, 5 + 7);
好了,第三节课的内容讲完了,下节上课前,检查作业哦。什么?忘了,那我再重复一遍,开始看书并做第三章到第五章的作业哦。