LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: wanglej

谭浩强与 K&R 的大出入

[复制链接]
发表于 2004-9-12 21:48:34 | 显示全部楼层
个人对谭的书无好感。他这本C的书只是一条一款的列出了语法,却并没有让人
领会为什么要有这些语法,有了这些东西我们究竟可以解决什么问题,这是国内计算机方面的书籍与国外原著的最大区别。

   谭写的书当语法(也仅仅只是语法)参考书到不错,至少是中文的,要想在他写的书
中发掘一点语义,挖掘点写程序的乐趣,或者还盼望着那天看着他的书突然就茅舍顿开,我想这大概不可能。

   一个枚举类型的对象只能是在一个在有限集合内取值。因而通常枚举用在定义取值有限的对象上。例如 :

  typedef enum _WeekDay {monday, tuesday, ...., sunday} WeekDay;
   WeekDay weekday;

枚举的好处在于
   1. 使代码简单易懂,例如if (weekday == 1)是什么谁也看不懂,但
       if( weekday == monday ) 就很好明白了
   2.  避免错误的取值。如上述的weekday 的对象,它永远也不应该取值星期        
   八。使用枚举,这些 错误可以在编译的时候被检查出来。

我觉得enum 是常量还是变量,这只是一个说法,应该也只是为了满足大多数人的习惯思维而已。就象大家非得讨论c++中struct 和class 的区别,什么时候应该用struct,什么时候用class。其实lippman 说得好, struct , class 这两个关键字并没有提供这种差别,差别在人们得思维方式上。

个人认为可以把weekday 看成一个变量,毕竟它在内存中分配了空间,且其内容可变,weekday 可以 用作 左值使用,这也是变量的一个最显著的特征。
发表于 2004-9-12 21:56:05 | 显示全部楼层
最初由 kj501 发表
可以认为枚举变量是一个取值范围受到限定的变量。如楼上的sex,就只能取man或者woman的值,取其它值的就是非法。


这是 C++ 里的用法吧。在 C 里,枚举值是同能够容纳所有值的算术类型等价的。下面的程序如果当作 C 程序来编译就没有错误,如果当作 C++ 程序来编译就有语法错误:
  1. int main(void)
  2. {
  3.         enum sex { male, female };
  4.         enum sex sex;
  5.         sex = 3;
  6.         return 0;
  7. }
复制代码
发表于 2004-9-12 23:24:21 | 显示全部楼层
终归来说,老谭早就该找个时间来把那本誉为“中国C语言教学经典”翻出来修修了。
发表于 2004-9-13 11:01:58 | 显示全部楼层
最初由 herberteuler 发表


  1. int main(void)
  2. {
  3.         enum sex { male, female };
  4.         enum sex sex;

  5.         sex = 3;
  6.         return 0;
  7. }
复制代码

你这种写法本身就违背了使用枚举的意图。既然sex被定义成了枚举,它的只能取male和female两个值,取任何其它值都是错误。C编译器之所以不提示错误,是因为C语言在设计时要保证程序员有较大的灵活性,很多错误只能靠程序员自己避免,不能指望靠编译器检查出来。当然,C++在这一点上要检查得严格多了。
ps:不要把枚举类型名与变量名取成相同的名字。
发表于 2004-9-14 14:25:53 | 显示全部楼层

是常量

就是常量
发表于 2004-9-15 05:00:43 | 显示全部楼层
以前的编译器哪有这么仔细啊?!枚举就是从1开始的自然数映射,"male,female"编译器理解直接等于1和2。
发表于 2004-9-15 08:32:52 | 显示全部楼层

回复: 有限取值,就应该称为常量.

最初由 wchy0914 发表
既然有限取值,就应该称为常量.
大家没见过
const enum people {man,woman};

const people sex;
的用法吧?
谭本来就是沽名刁誉之徒,他的那本c语言之所以销量高,实在是因为当时国内没有太多的选择.
谭出名是因为他的那本basic,那时国内更没有几本编程书.你想不买都不行.
大家没看到现在书店里有N本谭署名内容却一塌胡涂的书吗?
说谭是权威实在有点抬高他了,比较适合的身份是普及教材编著者.
那本C顶多是个HelloWorld级的教材.
不知道我说的对不对?

为什么?

我认为常量与变量的本质区别是:程序运行过程中能否改变其值(在LINUX系统上表现为这个量在只读数据段还是可写数据段)

因此用枚举类型既可以定义变量,也可以定义常量,而枚举项(man, woman)本身是常量
发表于 2004-9-17 22:05:33 | 显示全部楼层
sex是变量,(man  与 woman)是常量是肯定的. 枚举类型是变量是不会错的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表