清华大学教授谭浩强 ,浙江大学教授钱能,谁对谁错???请您评说。(关于'\0'的问题)

时间:2021-08-22 01:46:55
谭浩强的《C程序设计》,清华大学出版社 
1991年7月第一版  书号:ISBN 7-320-00860-4/TP.312  定价:20元
第92页: 
“需要说明的是:字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0'。像以下这样写完全是合法的:
  static char c[5]={'C','h','i','n','a'};
是否需要加'\0',完全根据需要决定。但是只要用字符串常量就会自动加一个'\0'。因此,人们为了处理方法一致,以及在程序中作相应的处理,在字符数组中也常常人为的加上一个'\0'。如:
   static char c[6]={'C','h','i','n','a','\0'};  ”

《C++程序设计教程》,钱能主编  清华大学出版社
1999年4月第一版   书号:ISBN 7-302-03421-4/TP.1858
第126页:
“如果要初始化一个字符串"hello",那么它定义的数组至少有六个数组元素,
例如,下面的代码给数组初始化,但会引起不可预料的错误:
  char array[5]="hello";
该代码不会引起编译错误,但由于改写了数组空间以外的内存单元,所以是危险的。”  

问:清华大学教授谭浩强与浙江大学教授钱能,谁对谁错???
    或者他们都对,这是c与c++语法的不同导致数组定义的区别?
请各路大侠拔刀相助,以解我多年心头之惑。

32 个解决方案

#1


钱能不对!

  char array[5]="hello";
该代码不会引起编译错误,但由于改写了数组空间以外的内存单元,所以是危险的。”  

这句话应该改成:
该代码不会引起编译错误,但由于在程序中容易被改写数组空间以外的内存单元(因为没有来表示字符串结束),所以是危险的。”  

#2


事实上,你搞错了!
不论是c还是c++,字符串都是以\0结束的!前者定义的是一个数组,里面的元素是字符,那这个数组就是由字符组成的数组,元素以单引号‘’的标志!在后面加上\0字符串是习惯,数组里的元素也是字符,但他以双引号“”标志,即字符串的形式存放在数组中去,然后分配元素,由于字符串后必须加\0,所以要以6位元素存放!所以要是以5位存放,后面的\0就会存放到别的内存单元去,替代别的单元,导致数据丢失,那是好危险的!!!

#3


两种方法都对。

但是他们表达的意思并不一样。

谭:书里指明了是字符数组,注意是数组,因此里面数据没有要求,有无0无所谓。

钱:虽然也是一个数组,但是他指明了是初始化字符串,注意是字符串。因此必须考虑0的大小。 字符串和字符数组并不是一个概念。

#4


两种说法并不矛盾,都是正确的。
注意潭老师是用的{'a','b'}这样的形式;
而钱老师用的"ab"这样的形式,后者自动跟有一个'\0'。

#5


同意以上观点

#6


同意楼上的!

#7


to neccui(PPC)
   我不明白你的意思。
   static char c[5]={'C','h','i','n','a'};
   char array[5]="hello";
   不都是字符数组定义并初始化吗???我看不出来他们是两个不同的概念。

高手快来啊,我要被弄糊涂了。

#8


不过谭浩强的〈C语言设计〉有50多处错误,知道吗?你可要小心啊!
最好先改正后再看!

#9


不过谭浩强的〈C语言设计〉有50多处错误,知道吗?你可要小心啊!
最好先改正后再看!

#10


钱能例子里的 "hello",实际就是{'h', 'e', 'l', 'l', 'o', '\0'},
所以他们两个都对

你可以把一个字符数组初始化成不含有结束符'\0',但记住这样就不能把它当字符串出来了。

#11


sdp(sdp) 大侠:
   我的C/C++水平很差,看不出来谭浩强 书中的错误,请大侠明示,在下感激不尽!谢谢您了,拜托!!!

#12


char array[5]="hello";
这是一个字符串赋值,后面的/0已经默认加上。
而char c[5]={'C','h','i','n','a'};不是字符串,是单个字符赋值。
   

#13


to xrenwu()
{'C','h','i','n','a'};
是一个数组
"hello"
是一个字符串(区别就是字符串末尾是0)

虽然被赋值的都是数组,但是源是有区别的。

#14


sdp(sdp) 大侠: 
   您说“谭浩强的〈C语言设计〉有50多处错误”,能不能告诉我???
如果这里不方便的话,可以给我发电邮:  llp166@citiz.net
再谢!!!

#15


以上各位大侠已经把这个问题讲的很透彻了
初始化string"hello"等于string array{'h','e','l','l','o','\0'},

#16


谭浩强《C语言程序设计(第二版)》前50页中的错误分析 

P1行1:…,它适于作为系统描述语言,…



这开宗明义的第一句话就说明谭先生对于计算机科学的术语不甚了了。什么叫“系统描述”,什么叫“系统程序设计”?人们都都说C是一种“系统程序设计语言”,而“系统描述语言”则完全是另一种东西。想必谭先生对它们之间的差异和关系都不清楚。在这种情况下就来下断言,一上马就露了怯。





P2表格:if  (e)  S;



这个错误说明谭先生对C语句基本结构也不清楚。在C语言里,分号是普通语句的结束符号,是语句的一部分。如果谭先生的S表示语句,那么后随的分号是必需的吗?如果谭先生的S表示语句中分号前面的一部分,那么又如何理解可以放在这里的 { ... } 顺序结构呢?它算语句吗?可以放在这里吗?要加分号吗?无论怎么看,谭先生都难以自圆其说!





P3行4:C语言是理想的结构化语言,…



不知谭先生的这个论断由何而来。C的创造者肯定不会说这句话,即使是C语言最*的崇拜者恐怕也不敢这样说。幸亏谭先生生在中国,其书只在中国出版,否则恐怕他就不会好过了,不知有多少人要找谭先生理论个究竟。





P3行7-8:例如整型量与字符型数据以及逻辑型数据可以通用。



此句子表现出的语文水平就不深究了。要问谭先生的简单问题是,“量”与“数据”是什么关系?再一个问题是,C语言什么时候增加了“逻辑型数据”?





P3行14:C语言允许直接访问物理地址。



不知这个论断从何而来。至少无法从C语言参考手册中找到根据,看来是谭先生为C语言增加的特殊功能。





P4程序:This is a c program.



通观世界上所有有关C语言的重要著作,C语言的名字“C”都是用大写表示。这里好象谭先生表示了对C的不肖,与前面大相径庭,不知何故。





P5行9:注释可以出现在程序中的任何位置。



这里又修改了C语言的规则。这里给谭先生提个小问题:“请找出在C程序里不能出现注释的位置(或说,加了注释就会改变程序意义的位置)。”请10秒钟内回答。





P5行12:“%d”表示“十进制整数类型”。



写程序有问题呀!怎么一遇到具体问题,写出的解释到处都是毛病。“%d”根本就不表示任何类型,它只是对函数printf提出一个转换要求。如果一个初学者产生这种理解偏差还有情可言,像谭先生这样的“大师”级人物也犯此等低级错误,实在是不可原谅。





P5行-8:scanf和printf都是C语言提供的标准输入输出函数…



按本人理解,C语言本身不提供任何有关输入输出的功能,也不提供任何标准函数。只是ANSI C建议了一个标准函数库。至少C参考手册上是这么说的,在谭书中其他部分也这么说。概念不太清楚就容易漏马脚。





P6行13:可以说C是函数式的语言。



太荒唐了,完全是望文生义。谭先生的计算机科学技术知识水平可见一斑。函数式语言是计算机科学领域中有明确意义的术语。再者说,即使不理解,也应该尽量回避一下大家都知道的东西,这下不就漏了底。说C是函数式语言,就像说谭先生是“错话大师”一样(毕竟他也说了许多对的话嘛!)。看来谭先生需要补一补计算机科学的基础知识,听说谭先生是清华大学毕业,那里的计算机系也还不错嘛。





P6行14-15:…ANSI C提供100多个库函数,Torbo C和MSC 4.0提供300多个库函数。



什么叫“提供”,这里的两个“提供”无论如何也不是同一个意思,因为将ANSI C和Torbo C、MSC 4.0并列讨论根本就没道理。谭先生知道它们各表示什么吗?知道语言标准和语言实现之间的关系和差异吗?





P7行12-14:当然,不同的计算机系统需要对函数库中的函数做不同的处理。不同的计算机系统除了提供函数库中的标准函数外,还按照硬件的情况提供一些专门的函数。



谭先生在这里说的是什么“计算机系统”,哪个层次的计算机系统?首先应该将这里的计算机系统都改为“C语言系统”。但是即使修改之后,最后一句话也没有讲到点子上,应该怎样修改就算留给谭先生的能力测验题了。





P9行-12和-2:选择“Compiler”菜单…  (4)执行程序。按“F10”键,…



看来谭先生也没怎么用过Turbo C。编辑之后如何去选择“Compiler”菜单,当然要先按F10键。但谭先生在这里就不讲,而到后面又讲。估计还是自己没怎么用过,没什么印象,不知怎样讲有助于学生使用。





P10行8:脱离Turbo C,…



这又是谭先生发明的不规范词汇。正规的术语是“退出”,“结束”,“终止”。





P11行5:…,但将后缀自动改成“.o”(表示它是 .obj文件),…



改什么后缀?实在弄不明白,至少不是规范的说法。再说了,它怎么又成了 .obj文件,在UNIX系统里那有“.obj文件”的容身之地?对UNIX术语不熟悉也不要自己随便发明说法嘛。





P11行13-14:此时,a.out中不存放目标文件。



首先,谭先生对目标文件和可执行文件的差异认识不清,在这里就露了马脚。另外,后半句的说法也实在不规范,a.out不过是个文件名,文件名中存放文件是什么意思呢?当然,初学者这么说也就罢了,“大师”这么说,实在令人遗憾!





P14行18:计算机算法可分为两大类别:数值运算算法和非数值运算算法。



听说过“数值算法”,但没有听说过“数值运算算法”。对于“非数值”也一样。谭先生在发明术语方面建树颇丰,但在基础教科书中大量发明术语又有什么理由呢?或者就是要给初学者找麻烦,或者就是对计算机科学技术的基本术语不甚了了,还能找到其他解释吗?





P19行-2:…,已为世界各国程序工作者普遍采用。



谭先生对世界了解得也不多呀!现在哪国程序工作者还广泛采用流程图呢?请列举一二!





P21行6-7:…,可以看出流程图是表示算法的较好工具。



和什么比较得出这个结论?今天计算机科技界还有多少人这样认识?谭先生独领风骚了。





P22行-6:1966年,Bohra和Jacopini提出了以下三种基本结构,…



请谭先生问问这两位先生是不是他们的发明,他们肯定诚惶诚恐。看来谭先生对计算机科学技术发展的历史也知之有限(知之有限并没有什么,但不要信口开河嘛)。这里给谭先生上一课:在ALGOL 60里这三种结构已经很清楚了。如果不信,请谭先生查阅ALGOL 60的手册(编程语言的最有名的文献了,谭先生没有看过吗?枉为大师了!)。60这个数我们都认识,它好象也比66小一点嘛。





P24行4:…有两类循环结构。



谭先生又下结论了,而且又是错的。究竟有多少类“典型的”循环结构?本人也不敢下结论。这方面的经典(全世界计算机专业工作者认为的,可能谭先生不这样认为)文献是Knuth的一篇文章,请谭先生自己找找看看。当然,还是先要弄清楚是那一篇,这就算是给谭先生出的一个查文献题吧。





P25行-5:因此,人们都普遍认为最基本的是本节介绍的三种基本结构。



谭先生这样认为,难道人们就得这样认为吗?实际上,人们认为是三类基本结构(不是三种),其中的分支结构和循环结构又有许多典型情况。谭先生的“本节”和这本书一样不可作为凭据。





P25行-1:1973年美国学者…和…提出了一种新的流程图形式。……



可惜新世纪版之新早已是旧世纪之旧了。综观世界,还有什么比较新的程序设计基础教材还在用N-S图讨论程序设计吗?这已经成为“中国特色”“谭先生特色”的东西了。中国的计算机基础教育早就应该抛弃这些已经被世界抛弃的落后描述技术了。





P28行14-21:归纳起来可知,一个结构化的算法是由一些基本结构顺序组成的;…。如果一个算法不能分解为若干个基本结构,则它必然不是一个结构化的算法。



看来谭先生对于计算机科学领域中的术语“嵌套”并不了解,也不会用。仔细看看谭先生书上的几个算法,就可以发现它们大都不是基本结构的顺序组合,而是嵌套组合。又学了一招。





P32行-14:…,保证了程序的质量。



保证了?没有吧!结构化方法的创始人们也不敢这样说。采用结构化方法一点也不耽误我们大家(包括谭先生)写出低质量的程序,如谭书中到处都可以看到的那样。





P38行3.1



什么是数据结构,计算机界自有公论。将“结构体”说成是一种数据结构实在会让人笑掉大牙的。是不是应该建议谭先生先读一两本数据结构教科书,而后在考虑写什么东西。





P39行-6:其值可以改变的量称为变量。



真糟糕!程序里的变量居然被谭先生当作一种“量”。任何通晓计算机科学技术的人都不会同意这种说法。“变量”到底是什么?将谭先生的上述说法与随后的描述做个对比,就不难发现他自己都无法自圆其说。





P39行-4到-2:变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。



这么简单的一句话里包含的错误太多了,谭先生请慎言,言多必失。首先,变量名根本不是什么符号地址(懂得什么叫符号地址吗?),它不过是在程序中代表变量的一种记号。一个变量也未必有地址(如寄存器变量),未必有唯一的地址(什么变量?谭先生知道吗?C语言里大量变量都是这样),这些都说明,将变量名看成符号地址是不行的,说不通的。其次,系统(什么系统?请说清楚。这里不想给出修改错误的提示了,算是给谭先生的一道语言作业题)是给变量分配地址,而不是给“变量名”分配地址。再者,每个变量的地址都是“编译连接”时分配的吗?或是对C语言了解肤浅,或者就是信口开河。要把这个论述改正确,请谭先生查阅有关材料,看C语言中有几种变量,地址是什么时候确定的(分配的)。





P40行-12:在C语言中,要求对所有用到的变量作强制定义,…



什么叫“强制定义”,好象没有这种说法嘛!我们都知道“强制”在C语言里有一个意思,就是不知道什么是“强制定义”。谭先生就简单说“先定义,后使用”还好一点,错误少一点,

#17


作者有很多东西说的很牵强,有鸡蛋里调骨头的嫌疑。有些地方的确谭说法欠妥,但是并不影响理解。看来谭先生的技术水平距离国外的大师们的确有一定差距。

作者的语气让我很不舒服,这个作者一定不是什么值得尊敬的人,虽然他能力显然不错。

我说的不是楼上,我估计不是楼上写的。

不过,我没有看过谭先生那本<<C++程序设计语言>>,我看的第一本C语言书籍是K&R的书,我只能根据现有的文词来发表一下意见。

#18


sorry,说错了一个地方,是<<C程序设计语言>>

#19


同意楼上的观点
我也正在看k&R的书,不过是英文版,进度很慢呀

#20


同意neccui(PPC) :
                  "两种方法都对。但是他们表达的意思并不一样。..."

#21


都对

#22


kbsoft(景乐) ,您精神可嘉, 谭浩强《C语言程序设计(第二版)》前50页中的错误是您发现的吗?  

#23


都对,这两种描述并不冲突。

#24


谭书看来需要重新修订。

#25


char array[5]="hello";
在vc中编译出错,vc编译器会进行边界检查

#26


两种说法不冲突.

#27


这么显然的事情,他们说的完全是两个意思,都对嘛。
要明白
char c[5] = {'H' , 'e' , 'l' , 'l' , 'o'};
和 char c[5] = "Hello"是不完全一样的。
前者本身没有问题,但作为字符串引用时是很危险的,因为没有字符串结束符;后者虽然被自动加上了结束符,但结束符越界,本身就有危险。

#28


看过了

#29


两个都对啊
???

#30


谢谢各位,问题已解决!!!

#31


要看就看英文原版,《C 程序设计》第2版。书店就有卖,经典。
至于那50个错误,唉,反正我是不抠字眼的。
另,此两种说法都是对的。

#32


我给了分,但是怎么没看见?

#1


钱能不对!

  char array[5]="hello";
该代码不会引起编译错误,但由于改写了数组空间以外的内存单元,所以是危险的。”  

这句话应该改成:
该代码不会引起编译错误,但由于在程序中容易被改写数组空间以外的内存单元(因为没有来表示字符串结束),所以是危险的。”  

#2


事实上,你搞错了!
不论是c还是c++,字符串都是以\0结束的!前者定义的是一个数组,里面的元素是字符,那这个数组就是由字符组成的数组,元素以单引号‘’的标志!在后面加上\0字符串是习惯,数组里的元素也是字符,但他以双引号“”标志,即字符串的形式存放在数组中去,然后分配元素,由于字符串后必须加\0,所以要以6位元素存放!所以要是以5位存放,后面的\0就会存放到别的内存单元去,替代别的单元,导致数据丢失,那是好危险的!!!

#3


两种方法都对。

但是他们表达的意思并不一样。

谭:书里指明了是字符数组,注意是数组,因此里面数据没有要求,有无0无所谓。

钱:虽然也是一个数组,但是他指明了是初始化字符串,注意是字符串。因此必须考虑0的大小。 字符串和字符数组并不是一个概念。

#4


两种说法并不矛盾,都是正确的。
注意潭老师是用的{'a','b'}这样的形式;
而钱老师用的"ab"这样的形式,后者自动跟有一个'\0'。

#5


同意以上观点

#6


同意楼上的!

#7


to neccui(PPC)
   我不明白你的意思。
   static char c[5]={'C','h','i','n','a'};
   char array[5]="hello";
   不都是字符数组定义并初始化吗???我看不出来他们是两个不同的概念。

高手快来啊,我要被弄糊涂了。

#8


不过谭浩强的〈C语言设计〉有50多处错误,知道吗?你可要小心啊!
最好先改正后再看!

#9


不过谭浩强的〈C语言设计〉有50多处错误,知道吗?你可要小心啊!
最好先改正后再看!

#10


钱能例子里的 "hello",实际就是{'h', 'e', 'l', 'l', 'o', '\0'},
所以他们两个都对

你可以把一个字符数组初始化成不含有结束符'\0',但记住这样就不能把它当字符串出来了。

#11


sdp(sdp) 大侠:
   我的C/C++水平很差,看不出来谭浩强 书中的错误,请大侠明示,在下感激不尽!谢谢您了,拜托!!!

#12


char array[5]="hello";
这是一个字符串赋值,后面的/0已经默认加上。
而char c[5]={'C','h','i','n','a'};不是字符串,是单个字符赋值。
   

#13


to xrenwu()
{'C','h','i','n','a'};
是一个数组
"hello"
是一个字符串(区别就是字符串末尾是0)

虽然被赋值的都是数组,但是源是有区别的。

#14


sdp(sdp) 大侠: 
   您说“谭浩强的〈C语言设计〉有50多处错误”,能不能告诉我???
如果这里不方便的话,可以给我发电邮:  llp166@citiz.net
再谢!!!

#15


以上各位大侠已经把这个问题讲的很透彻了
初始化string"hello"等于string array{'h','e','l','l','o','\0'},

#16


谭浩强《C语言程序设计(第二版)》前50页中的错误分析 

P1行1:…,它适于作为系统描述语言,…



这开宗明义的第一句话就说明谭先生对于计算机科学的术语不甚了了。什么叫“系统描述”,什么叫“系统程序设计”?人们都都说C是一种“系统程序设计语言”,而“系统描述语言”则完全是另一种东西。想必谭先生对它们之间的差异和关系都不清楚。在这种情况下就来下断言,一上马就露了怯。





P2表格:if  (e)  S;



这个错误说明谭先生对C语句基本结构也不清楚。在C语言里,分号是普通语句的结束符号,是语句的一部分。如果谭先生的S表示语句,那么后随的分号是必需的吗?如果谭先生的S表示语句中分号前面的一部分,那么又如何理解可以放在这里的 { ... } 顺序结构呢?它算语句吗?可以放在这里吗?要加分号吗?无论怎么看,谭先生都难以自圆其说!





P3行4:C语言是理想的结构化语言,…



不知谭先生的这个论断由何而来。C的创造者肯定不会说这句话,即使是C语言最*的崇拜者恐怕也不敢这样说。幸亏谭先生生在中国,其书只在中国出版,否则恐怕他就不会好过了,不知有多少人要找谭先生理论个究竟。





P3行7-8:例如整型量与字符型数据以及逻辑型数据可以通用。



此句子表现出的语文水平就不深究了。要问谭先生的简单问题是,“量”与“数据”是什么关系?再一个问题是,C语言什么时候增加了“逻辑型数据”?





P3行14:C语言允许直接访问物理地址。



不知这个论断从何而来。至少无法从C语言参考手册中找到根据,看来是谭先生为C语言增加的特殊功能。





P4程序:This is a c program.



通观世界上所有有关C语言的重要著作,C语言的名字“C”都是用大写表示。这里好象谭先生表示了对C的不肖,与前面大相径庭,不知何故。





P5行9:注释可以出现在程序中的任何位置。



这里又修改了C语言的规则。这里给谭先生提个小问题:“请找出在C程序里不能出现注释的位置(或说,加了注释就会改变程序意义的位置)。”请10秒钟内回答。





P5行12:“%d”表示“十进制整数类型”。



写程序有问题呀!怎么一遇到具体问题,写出的解释到处都是毛病。“%d”根本就不表示任何类型,它只是对函数printf提出一个转换要求。如果一个初学者产生这种理解偏差还有情可言,像谭先生这样的“大师”级人物也犯此等低级错误,实在是不可原谅。





P5行-8:scanf和printf都是C语言提供的标准输入输出函数…



按本人理解,C语言本身不提供任何有关输入输出的功能,也不提供任何标准函数。只是ANSI C建议了一个标准函数库。至少C参考手册上是这么说的,在谭书中其他部分也这么说。概念不太清楚就容易漏马脚。





P6行13:可以说C是函数式的语言。



太荒唐了,完全是望文生义。谭先生的计算机科学技术知识水平可见一斑。函数式语言是计算机科学领域中有明确意义的术语。再者说,即使不理解,也应该尽量回避一下大家都知道的东西,这下不就漏了底。说C是函数式语言,就像说谭先生是“错话大师”一样(毕竟他也说了许多对的话嘛!)。看来谭先生需要补一补计算机科学的基础知识,听说谭先生是清华大学毕业,那里的计算机系也还不错嘛。





P6行14-15:…ANSI C提供100多个库函数,Torbo C和MSC 4.0提供300多个库函数。



什么叫“提供”,这里的两个“提供”无论如何也不是同一个意思,因为将ANSI C和Torbo C、MSC 4.0并列讨论根本就没道理。谭先生知道它们各表示什么吗?知道语言标准和语言实现之间的关系和差异吗?





P7行12-14:当然,不同的计算机系统需要对函数库中的函数做不同的处理。不同的计算机系统除了提供函数库中的标准函数外,还按照硬件的情况提供一些专门的函数。



谭先生在这里说的是什么“计算机系统”,哪个层次的计算机系统?首先应该将这里的计算机系统都改为“C语言系统”。但是即使修改之后,最后一句话也没有讲到点子上,应该怎样修改就算留给谭先生的能力测验题了。





P9行-12和-2:选择“Compiler”菜单…  (4)执行程序。按“F10”键,…



看来谭先生也没怎么用过Turbo C。编辑之后如何去选择“Compiler”菜单,当然要先按F10键。但谭先生在这里就不讲,而到后面又讲。估计还是自己没怎么用过,没什么印象,不知怎样讲有助于学生使用。





P10行8:脱离Turbo C,…



这又是谭先生发明的不规范词汇。正规的术语是“退出”,“结束”,“终止”。





P11行5:…,但将后缀自动改成“.o”(表示它是 .obj文件),…



改什么后缀?实在弄不明白,至少不是规范的说法。再说了,它怎么又成了 .obj文件,在UNIX系统里那有“.obj文件”的容身之地?对UNIX术语不熟悉也不要自己随便发明说法嘛。





P11行13-14:此时,a.out中不存放目标文件。



首先,谭先生对目标文件和可执行文件的差异认识不清,在这里就露了马脚。另外,后半句的说法也实在不规范,a.out不过是个文件名,文件名中存放文件是什么意思呢?当然,初学者这么说也就罢了,“大师”这么说,实在令人遗憾!





P14行18:计算机算法可分为两大类别:数值运算算法和非数值运算算法。



听说过“数值算法”,但没有听说过“数值运算算法”。对于“非数值”也一样。谭先生在发明术语方面建树颇丰,但在基础教科书中大量发明术语又有什么理由呢?或者就是要给初学者找麻烦,或者就是对计算机科学技术的基本术语不甚了了,还能找到其他解释吗?





P19行-2:…,已为世界各国程序工作者普遍采用。



谭先生对世界了解得也不多呀!现在哪国程序工作者还广泛采用流程图呢?请列举一二!





P21行6-7:…,可以看出流程图是表示算法的较好工具。



和什么比较得出这个结论?今天计算机科技界还有多少人这样认识?谭先生独领风骚了。





P22行-6:1966年,Bohra和Jacopini提出了以下三种基本结构,…



请谭先生问问这两位先生是不是他们的发明,他们肯定诚惶诚恐。看来谭先生对计算机科学技术发展的历史也知之有限(知之有限并没有什么,但不要信口开河嘛)。这里给谭先生上一课:在ALGOL 60里这三种结构已经很清楚了。如果不信,请谭先生查阅ALGOL 60的手册(编程语言的最有名的文献了,谭先生没有看过吗?枉为大师了!)。60这个数我们都认识,它好象也比66小一点嘛。





P24行4:…有两类循环结构。



谭先生又下结论了,而且又是错的。究竟有多少类“典型的”循环结构?本人也不敢下结论。这方面的经典(全世界计算机专业工作者认为的,可能谭先生不这样认为)文献是Knuth的一篇文章,请谭先生自己找找看看。当然,还是先要弄清楚是那一篇,这就算是给谭先生出的一个查文献题吧。





P25行-5:因此,人们都普遍认为最基本的是本节介绍的三种基本结构。



谭先生这样认为,难道人们就得这样认为吗?实际上,人们认为是三类基本结构(不是三种),其中的分支结构和循环结构又有许多典型情况。谭先生的“本节”和这本书一样不可作为凭据。





P25行-1:1973年美国学者…和…提出了一种新的流程图形式。……



可惜新世纪版之新早已是旧世纪之旧了。综观世界,还有什么比较新的程序设计基础教材还在用N-S图讨论程序设计吗?这已经成为“中国特色”“谭先生特色”的东西了。中国的计算机基础教育早就应该抛弃这些已经被世界抛弃的落后描述技术了。





P28行14-21:归纳起来可知,一个结构化的算法是由一些基本结构顺序组成的;…。如果一个算法不能分解为若干个基本结构,则它必然不是一个结构化的算法。



看来谭先生对于计算机科学领域中的术语“嵌套”并不了解,也不会用。仔细看看谭先生书上的几个算法,就可以发现它们大都不是基本结构的顺序组合,而是嵌套组合。又学了一招。





P32行-14:…,保证了程序的质量。



保证了?没有吧!结构化方法的创始人们也不敢这样说。采用结构化方法一点也不耽误我们大家(包括谭先生)写出低质量的程序,如谭书中到处都可以看到的那样。





P38行3.1



什么是数据结构,计算机界自有公论。将“结构体”说成是一种数据结构实在会让人笑掉大牙的。是不是应该建议谭先生先读一两本数据结构教科书,而后在考虑写什么东西。





P39行-6:其值可以改变的量称为变量。



真糟糕!程序里的变量居然被谭先生当作一种“量”。任何通晓计算机科学技术的人都不会同意这种说法。“变量”到底是什么?将谭先生的上述说法与随后的描述做个对比,就不难发现他自己都无法自圆其说。





P39行-4到-2:变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。



这么简单的一句话里包含的错误太多了,谭先生请慎言,言多必失。首先,变量名根本不是什么符号地址(懂得什么叫符号地址吗?),它不过是在程序中代表变量的一种记号。一个变量也未必有地址(如寄存器变量),未必有唯一的地址(什么变量?谭先生知道吗?C语言里大量变量都是这样),这些都说明,将变量名看成符号地址是不行的,说不通的。其次,系统(什么系统?请说清楚。这里不想给出修改错误的提示了,算是给谭先生的一道语言作业题)是给变量分配地址,而不是给“变量名”分配地址。再者,每个变量的地址都是“编译连接”时分配的吗?或是对C语言了解肤浅,或者就是信口开河。要把这个论述改正确,请谭先生查阅有关材料,看C语言中有几种变量,地址是什么时候确定的(分配的)。





P40行-12:在C语言中,要求对所有用到的变量作强制定义,…



什么叫“强制定义”,好象没有这种说法嘛!我们都知道“强制”在C语言里有一个意思,就是不知道什么是“强制定义”。谭先生就简单说“先定义,后使用”还好一点,错误少一点,

#17


作者有很多东西说的很牵强,有鸡蛋里调骨头的嫌疑。有些地方的确谭说法欠妥,但是并不影响理解。看来谭先生的技术水平距离国外的大师们的确有一定差距。

作者的语气让我很不舒服,这个作者一定不是什么值得尊敬的人,虽然他能力显然不错。

我说的不是楼上,我估计不是楼上写的。

不过,我没有看过谭先生那本<<C++程序设计语言>>,我看的第一本C语言书籍是K&R的书,我只能根据现有的文词来发表一下意见。

#18


sorry,说错了一个地方,是<<C程序设计语言>>

#19


同意楼上的观点
我也正在看k&R的书,不过是英文版,进度很慢呀

#20


同意neccui(PPC) :
                  "两种方法都对。但是他们表达的意思并不一样。..."

#21


都对

#22


kbsoft(景乐) ,您精神可嘉, 谭浩强《C语言程序设计(第二版)》前50页中的错误是您发现的吗?  

#23


都对,这两种描述并不冲突。

#24


谭书看来需要重新修订。

#25


char array[5]="hello";
在vc中编译出错,vc编译器会进行边界检查

#26


两种说法不冲突.

#27


这么显然的事情,他们说的完全是两个意思,都对嘛。
要明白
char c[5] = {'H' , 'e' , 'l' , 'l' , 'o'};
和 char c[5] = "Hello"是不完全一样的。
前者本身没有问题,但作为字符串引用时是很危险的,因为没有字符串结束符;后者虽然被自动加上了结束符,但结束符越界,本身就有危险。

#28


看过了

#29


两个都对啊
???

#30


谢谢各位,问题已解决!!!

#31


要看就看英文原版,《C 程序设计》第2版。书店就有卖,经典。
至于那50个错误,唉,反正我是不抠字眼的。
另,此两种说法都是对的。

#32


我给了分,但是怎么没看见?