评《C和C#标准是不一样的》 读谭师傅的书(4)
Mar 20

前面已经学习过第1.2节。现在接着学习第1.3节,《简单的C语言程序介绍》。

这一节以三个简单的C程序为例,讲解了C语言的基本结构、语法,以及初步的函数的概念。看得出有刻意求新的地方,比如很有味道的“Hello World”就变成了枯燥无味的“This is a C program.”。

这一节的主要学习心得如下:

1、变量是在“声明”的时候就“定义”了,不管有没有同时给它赋值。如例1.2和1.3的注释部分,以及谭师傅在解释例1.2时对“int a,b,sum;”讲解说它“是声明部分,定义变量a和b,指定a和b为整型“。

2. 一行可以写好几个语句,只要写得下。

3、函数返回值的类型也可以叫做“函数的类型”。

4、一个函数所调用的函数是在本身函数体的声明部分声明的。

当然,以上心得都是作为反面案例来学习的。

好了,1.3节就学习到这里了。以后接着学习

注:原本有更多的心得,是针对第二版写的。现在发现第三版已经改了不少,所以就以第三版为准了。

“读谭师傅的书(3)”有5篇评论

  1. Says:

    eng你老兄就别浪费时间和他较劲了。实际上很多人,包括学生并不把他当回事。错误实在是太明显。



    我是没事写着玩,倒也不是和谁较劲 ;) 算是检验自己知识的一种方式吧。

  2. supernova Says:

    呵呵,我看见网上对谭浩强的评价是他是CS界的败类。



    人家好歹是一世界记录保持者,还是有很多的,这个怎么说呢,算是粉丝吧。

  3. gne Says:

    读•读谭师傅的书(3)

    一般人学C语言,用新的话会有些疑问。ENG比较刻意求新。比如正常人看不懂的地方回去问,到eng这里就变成了枯燥无味的讽刺。好像学不会东西是别人的错。

    这一节的主要学习心得如下:
    (对了,因为ENG似乎对K&R情有独钟,非常坚决的捍卫K&R是书不是人的“约定”,我们就赖以K&R为标准帮助ENG解答一下他的疑问。)

    1) 变量的声明与定义。根据K&R,在使用外部变量(external variable)的时候,变量的声明与定义是特别区分开来用的。
    本来以为eng看书一目十行,已经从1.2节跳到了后面,外部变量。再看后半句,下巴险些掉下来。“不管有没有同时给他赋值”。啊?原来他认为-声明与定义的区别是赋值?!
    看看K&R是不是这么说的?呦,不是!

    要注意,在讨论外部变量的时候,我们谨慎使用“定义”和“声明”这两个词。“定义”指变量被建立分配给存储空间;“声明”指变量的用法被宣布,但存储空间未被分配。

    首先没搞明白自己在学哪一章,更甚,指声明和定义的区别是同时赋值与否。没学会不是错,出来显摆自己没学会就是张铁生了。
    2) Eng好像不知道C语言曾经允许一行可以写好几个语句。虽然ANSI C89没有支持 “一行可以写好几个语句”,谭老师可以考虑根据C 89/C 99改变这句说法。但是多数编译器依然可以编译一行有多个语句的源程序。
    看来eng还真年轻,没见过89 以前的C。不然eng的口气,怎么回放过这种说“美好的70年代”的机会?http://www.lysator.liu.se/c/bwk-tutor.html
    The format of C programs is quite free. We can put several statements on a line if we want, or we can split a statement among several lines if it seems desirable.
    3) 不明白eng是装还是真糊涂。当不产生歧义的时候,函数类型和函数返回值的类型是不区别来讲的。这不仅是语言简练问题,鸡蛋里面挑骨头只会导致初学者更难理解新概念。既然eng忠实捍卫K&R“是书不是人”,那就看看K&R是如何讨论函数返回值的:
    The return statement is the mechanism for returning a value from the called function to its caller. Any expression can follow
    return:
    return expression;
    The expression will be converted to the return type of the function if necessary…

    4)“一个函数所调用的函数是在本身函数体的声明部分声明的。”这就属于eng的没有错误,制造错误也要批了。不仅eng错误理解了原文(原文是说函数的声明部分是用来定义变量和声明将要被调用的函数的,而不是说每“一个”被调用函数都需要在调用函数内声明的),而且看来eng又被声明与定义搞得头大了:在调用函数中声明被调用函数,编译器才知道函数的参数,返回值类型等信息。被调用函数的定义则是在调用函数之外。这并没有什么值得大惊小怪的。

    学习心得:学不会C不要紧,要说成会的人错。只要口气咋呼“难道2比1大吗?”的话都敢说。人笨,不妨骂刀钝。当年我美术课成绩从来不高,怎么没想起来发表博文“美术老师一派胡言,他居然说红色混合蓝色就成了紫色”。哎,惭愧惭愧。

  4. san Says:

    为什么一定要用“Hello World”,而不能用“This is a C program.”呢?真是奇怪的逻辑。“Hello World”就一定“很有味道”而“This is a C program.”就是“枯燥无味的”?是什么标准?你去问问读者。难道全世界的书的第一个例子都一定要用“Hello World”吗?真是可笑。
    有的人吃了几年洋面包,就以为自己是圣贤,什么都懂。动辄“美国如何如何”,以为中国人都是阿斗,什么都不懂,可以任他忽悠。
    什么废话都别说,有本事你写一本“高水平”的C教材,让读者评论一下。听说你已写了一本,赶快印出来,看看发行量能不能超过谭老师!

  5. 穆扬 Says:

    gne的这篇评论强词夺理

发表评论

CAPTCHA Image
*