免费注册 查看新帖 |

Chinaunix

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

从函式角度看 i++ 和 ++i [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-15 11:39 |只看该作者 |倒序浏览
学了点函式编程后,回过头来看 c 语言,到处都是副作用。

不知道大家以前是怎么看待  i++ 和 ++i 的。一般书上都是先如何再如何,硬把时态附加到'数学'表达式上。我以前也是按照这种方式来理解这个表达式的。学习了副作用的观点后,对这两个表达式有了很简洁的解释:

1) i++, ++i 的副作用都是使变量 i 的值增加 1

2) 表达式 i++ 的值是 i

3) 表达式 ++i 的值是 i+1

我觉得这样解释很完美了。

赋值表达式 x=1 可以这样解释

1) x=1 的值为 1

2) 副作用为使得变量 x  的值变为 1。

区分了变量的值和表达式的值。


呵呵,是不是有点变态。

[ 本帖最后由 retuor 于 2009-3-15 11:41 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-03-15 13:13 |只看该作者
原帖由 retuor 于 2009-3-15 11:39 发表
区分了变量的值和表达式的值。


呵呵,是不是有点变态。

一点也不,如果再看点程序设计语言原理方面的书,你会发现,即使在命令式语言中,也照样是区分变量的值和表达式的值的。只不过在一般讲语言使用的书中不强调这个罢了。

论坛徽章:
0
3 [报告]
发表于 2009-03-15 13:23 |只看该作者
说的对。但对命令式过来的人,可能会对这个有点‘异样感觉‘。

比如

printf ();

是有值的,但一般不去管它,只关心它的副作用。

在一些比较学究或严格的代码中,printf 调用被写为

(void) printf ();

这样就明确地指出了要抛弃 printf 的返回值。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2009-03-15 18:12 |只看该作者
原帖由 retuor 于 2009-3-15 13:23 发表
在一些比较学究或严格的代码中,printf 调用被写为

(void) printf ();

这样就明确地指出了要抛弃 printf 的返回值。

这不是学究,而是为了避免在某些情况下的警告,例如 lint 或者较严格的编译器检查。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-03-16 14:40 |只看该作者
我认为这就学习 FP 的意义之一。
学了 Haskell 之后,再反过来看 C 语言里面的一些经典问题,会发现答案其实都是显而易见的。

论坛徽章:
0
6 [报告]
发表于 2009-03-16 16:40 |只看该作者

回复 #5 flw 的帖子

可爱的flw ,好讨厌你

论坛徽章:
0
7 [报告]
发表于 2009-03-16 19:49 |只看该作者
>>这不是学究,而是为了避免在某些情况下的警告,例如 lint 或者较严格的编译器检查。

确实如此。

我觉得 lint 有点过分严格了,是个学究的检错器。

[ 本帖最后由 retuor 于 2009-3-16 20:10 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2009-03-16 21:35 |只看该作者
原帖由 retuor 于 2009-3-16 19:49 发表
>>这不是学究,而是为了避免在某些情况下的警告,例如 lint 或者较严格的编译器检查。

确实如此。

我觉得 lint 有点过分严格了,是个学究的检错器。

它有许多选项,好些警告都是可以有选择的关掉的。不过,那些警告往往都是不符合标准或者有潜在的问题。当然,现在的 lint 还不够智能。记得在什么地方看到过这么一句话:(大意)在 lint 警告全开的情况下,几乎不可能写出没有警告的稍微有点实用性的程序

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2009-03-17 11:17 |只看该作者
lint 代表了一些人的想法,现行的 C 编译器代表的是另一些人的想法。
曾经有人提议将 lint 继承到 gcc 内部,结果没人鸟他。
不过 gcc 现在的警告是越来越丰富了,我想最终业界会在 lint 和现行的 C 编译器之间找到一个合理的平衡点吧。
到那时候就不再需要 lint 了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP