免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7172 | 回复: 27
打印 上一主题 下一主题

[C] 在《C程序设计伴侣》的交通灯例子中,我为什么没有使用解读专家的所谓更聪明的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-22 23:16 |只看该作者 |倒序浏览
今天在豆瓣看到解读专家的关于交通灯这个例子中的一段读书笔记
2012-10-20 14:24:09 薛非

32. if(red == light)
33. puts("STOP"); // 停止
34. // 如果交通灯是绿色
35. else if( green == light )
36. puts("Go!Go!Go!"); // 继续前行


这是在教唆愚蠢
下面三种写法都比原来好

01.if(red == light)
02. puts("STOP");
03.if( green == light )
04. puts("Go!Go!Go!");

01.if( red == light )
02. puts("STOP");
03.else
04. puts("Go!Go!Go!");

01.puts( red == light?"STOP":"Go!Go!Go!");

我想说说为什么没有采用他提供的这三种更聪明的方法

01.if(red == light)
02. puts("STOP");
03.if( green == light )
04. puts("Go!Go!Go!");
// 这种方法,比较近似
// 然而让我想不痛的是,既然light都已经等于red了,为啥后面接着还要来个if判断light是否等于green?
// 这让我想起他曾经说我代码没有逻辑,明明fp不可能为NULL,而要去判断是多此一举
// 而这里,两个互斥的两个条件并列,所以我用了if...else if

01.if( red == light )
02. puts("STOP");
03.else
04. puts("Go!Go!Go!");
// 在我看来,这样写很危险
// 如果light为yellow呢?

01.puts( red == light?"STOP":"Go!Go!Go!");
// 这种形式,我说什么好呢?
// 同样存在第二种的light为其他颜色的问题
// 同时,我也觉得这种代码缺乏可读性,对于初学者,估计会把读者搞得云里雾里

所以,我没有采用这些在他看来更好的写法。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-10-22 23:23 |只看该作者
这种2B帖子可以删除了。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
3 [报告]
发表于 2012-10-22 23:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2012-10-22 23:39 |只看该作者
两位专家终于达成默契了

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
5 [报告]
发表于 2012-10-22 23:40 |只看该作者
小乔能来,大家能当面锣对面鼓地,是好事。

别搞砸了。

论坛徽章:
0
6 [报告]
发表于 2012-10-22 23:40 |只看该作者
  1. #include <stdio.h>    // 引入标准输出函数puts()的声明
  2. #include <stdlib.h>       // 引入随机数函数rand()和srand()的声明
  3. #include <time.h>     // 引入时间函数time()的声明
  4. // 枚举交通灯的颜色
  5. [color=Red]enum trafficlight
  6. {
  7.     red = 0,    // 红色
  8.     green       // 绿色
  9. };[/color]
  10. int main()
  11. {
  12.     // 用当前时间初始化随机种子
  13.     // 在C语言中,rand()函数所产生的随机数实际上是一个伪随机数(如果不使
  14.     // 用srand()函数初始化随机种子,每次调用都会产生相同的随机数)。而srand()的
  15.     // 意义就在于用一个真实的随机数(也就是所谓的随机种子),通常是当前系统时
  16.     // 间,作为初始条件,然后用一定的算法不停迭代产生真实的随机数
  17.     srand(time(NULL));
  18.     // 这里的rand()函数会产生一个0 到 RAND_MAX
  19.     // (不同的编译器对这个值有不同的定义,但是都会大于32767)之间的整数,
  20.     // 对这个整数用“%”对2进行取余运算,得到的就是随机的0或者1,
  21.     // 用来表示当前交通灯的红绿灯颜色
  22.     int light = rand()%2;
  23.     // 开始进入条件结构进行判断
  24.     // 如果交通灯是红色
  25.     // 在将一个变量(light)和一个常量(red)进行“==”比较的时候,
  26.     // 我们通常将常量放在“==”符号的前面,变量放在“==”符号的后面,
  27.     // 虽然两者位置颠倒在语法上也同样成立,但是将常量放在“==”之前,
  28.     // 可以避免因为疏忽(少写一个“=”号)引起的“常量=变量”错误。
  29.     // 针对这种错误,编译器会给出错误提示,不能为一个常量赋值,
  30.     // 如果将变量放在“=”前,编译器不会对“变量=常量”提示错误,也就
  31.     // 无法及时地发现这种极具隐蔽性的错误。
  32.     if(red == light)
  33.         puts("STOP");  // 停止
  34.     // 如果交通灯是绿色
  35.     else if( green == light )
  36.         puts("Go!Go!Go!"); // 继续前行
  37.     return 0;
  38. }
复制代码
我想说说为什么没有采用他提供的这三种更聪明的方法

01.if(red == light)
02. puts("STOP";
03.if( green == light )
04. puts("Go!Go!Go!";
// 这种方法,比较近似
// 然而让我想不痛的是,既然light都已经等于red了,为啥后面接着还要来个if判断light是否等于green?
// 这让我想起他曾经说我代码没有逻辑,明明fp不可能为NULL,而要去判断是多此一举
// 而这里,两个互斥的两个条件并列,所以我用了if...else if

01.if( red == light )
02. puts("STOP";
03.else
04. puts("Go!Go!Go!";
// 在我看来,这样写很危险
// 如果light为yellow呢?


01.puts( red == light?"STOP":"Go!Go!Go!";
// 这种形式,我说什么好呢?
// 同样存在第二种的light为其他颜色的问题
// 同时,我也觉得这种代码缺乏可读性,对于初学者,估计会把读者搞得云里雾里

所以,我没有采用这些在他看来更好的写法。


解毒专家说你蠢,你没必要跳出来自己证明自己蠢吧

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
7 [报告]
发表于 2012-10-22 23:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
8 [报告]
发表于 2012-10-22 23:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
9 [报告]
发表于 2012-10-23 01:44 |只看该作者
鼓掌鼓掌~~搬小板凳旁观~~刚刚看完《本杰明·巴顿奇事》~

恩,如果是我的话,enum基本上就意味着switch了~~嘿嘿

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
10 [报告]
发表于 2012-10-23 09:11 |只看该作者
近距离围观楼主.
传说中的大神啊.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP