| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1165 人关注过本帖
标题:转帖一篇博文:王垠:程序设计里的“小聪明”(1)
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
 问题点数:0 回复次数:18 
转帖一篇博文:王垠:程序设计里的“小聪明”(1)
https://blog.bccn.net/%E9%9D%99%E5%A4%9C%E6%80%9D/12888
搜索更多相关主题的帖子: 程序设计 
2013-04-01 08:17
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
是静老大的贴?

好像以前看过,顶一下


[fly]存在即是合理[/fly]
2013-04-01 08:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
"从理论上讲,++操作本身就是错误的设计"
------ 不同意这句话。通俗的讲,我认为 ++ 比 + 更原子,所以它存在的基石肯定比+要牢靠

为什么C会有++? 那是因为在机器指令中自增是很常用的指令。让C没有++,如同让汇编没有INC/DEC。
当然,以上只能算半个理由,因为C代码还需要经过编译器,编译器完全可以将i=i+1翻译为INC。

从语义上讲,“自增”是无法通过“加1”来表达的,也就是“自增”,不是“加”一个特定的数“1”(虽然对于整型等如是),因为“自增”不需要达到“加”的层次(我觉得这句话很好理解^_^,虽然短了些)
我想用C++中的 非随机迭代器的operator++ 来说明,但很多Cer讨厌C++,所以不说了:)

最后,我一直认为“后置++ 是多余的,有害的”^_^,不知道谁来教教我?


“请分析:这样多写两个花括号,是好还是不好? ”
------ Google就是想说不好呗。我来举个反例
for( …… )
     printf(……);
如果有人想修改,会连for一起整体删除掉
2013-04-01 09:08
lxsjzbd
Rank: 4
来 自:河北省
等 级:业余侠客
帖 子:97
专家分:258
注 册:2012-3-31
收藏
得分:0 
(其实里面的两个 i 是完全不同的变量)
咋理解啊,赋值之前吗?
2013-04-01 09:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 3楼 rjsp
除了最后一段,前面的基本同意。最后那一个,其实不是删除的问题,而是要添加代码的问题,没有花括号的时候,要添加多行语句所花的功夫更多,而且事实上没有花括号看起来也不清晰。

授人以渔,不授人以鱼。
2013-04-01 09:16
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
也许后加是为了写出这种代码

for (int i = 0; i < n; scanf("%d", a[i++]));
for (int i = 0; i < n; printf(" %d", a[i++]));

这种代码有没有可取之处?

可读行也不差啊


[fly]存在即是合理[/fly]
2013-04-01 09:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用lxsjzbd在2013-4-1 09:12:54的发言:

(其实里面的两个 i 是完全不同的变量)
咋理解啊,赋值之前吗?

对i++来说,是两个不同的变量。i++的操作,由于表达式要返回i自增前的值,所以不能把i的值冲掉,要找个临时地方把这个需要返回的值寄存起来,所以不管里面怎么操作,都需要一个临时变量,让i自身变化,然而返回给调用者的是i变化前的值。但是++i较简单,因为这个表达式直接返回i变化后的值,不需要寄存原值。在这个角度看,++i比i++稍为原子一些,理论上它的效率更多,不过实际上并不显著,很多时候优秀的编译器会在衡量过效果不变的情况下把i++或i=i+1变换为++i,但前提是你的代码写起来能让编译器分析得出结论,否则它会按原义编译。但是,在这些地方花功夫是不值得的,这点那篇博文说得对。

授人以渔,不授人以鱼。
2013-04-01 09:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 6楼 azzbcc
这种代码其实是不清晰的,循环步进表达式的意义不明确,应把功能语句放在循环中,步进表达式就集中表达如何步进,而不是带有副作用。这类似于函数中执行了从命名中看不出的动作,比如那个求较大值的函数,在函数里面带有输出语句就是不应该的。

授人以渔,不授人以鱼。
2013-04-01 09:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用TonyDeng在2013-4-1 09:16:48的发言:

除了最后一段,前面的基本同意。最后那一个,其实不是删除的问题,而是要添加代码的问题,没有花括号的时候,要添加多行语句所花的功夫更多,而且事实上没有花括号看起来也不清晰。

Google认为以后可能要添加代码,所以留着{},而我认为对某些for而言,不会有“添加”,因为修改时会直接全删除掉(连同for),重写。
当然,这是个小小的风格选择,无伤大雅。

2013-04-01 09:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,是风格问题。其实我也倾向于无论如何都带花括号,在写for()、if()、while()等语句的时候,不先写里面的东西,马上就写出一对花括号,先占了2行,然后再填写具体的代码,这样怎么改都不至于犯错。不带花括号,仅靠缩进有时会误导人,比如有人多手敲了分号,习惯了敲花括号的手势,就不至于敲分号。

以下的代码,我觉得前面的比后面的好看:
程序代码:
for ()
{
    ……
}
……
for ()
    ……
……

授人以渔,不授人以鱼。
2013-04-01 09:37
快速回复:转帖一篇博文:王垠:程序设计里的“小聪明”(1)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032687 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved