| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1167 人关注过本帖
标题:转帖一篇博文:王垠:程序设计里的“小聪明”(1)
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
 问题点数:0 回复次数:7 
转帖一篇博文:王垠:程序设计里的“小聪明”(1)
https://blog.bccn.net/%E9%9D%99%E5%A4%9C%E6%80%9D/12888
搜索更多相关主题的帖子: 程序设计 
2013-04-01 08:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 3楼 rjsp
除了最后一段,前面的基本同意。最后那一个,其实不是删除的问题,而是要添加代码的问题,没有花括号的时候,要添加多行语句所花的功夫更多,而且事实上没有花括号看起来也不清晰。

授人以渔,不授人以鱼。
2013-04-01 09:16
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
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用lxsjzbd在2013-4-1 09:39:45的发言:

我是这样理解的,i++和++i运算结束后,i都为i+1,不过i++和++i的表达式的值不同,

你看j=i++这一表达式,该行执行完毕后,j是i变化前的值,而j=++i是等于i变化后的值,这两个算符的区别在这里。翻译如下:

j=i++
j=i;
i=i+1;


j=++i
i=i+1;
j=i;


这就是所谓的前加和后加,区别在i=i+1在前还在是后。只要你理解这个原理,心中默想编译器会做这种代码展开,就会明白,当编译器遇到诸如j=(i++)+(++i)这类语句时,它将会如何无所适从,事实上C标准并没有规定编译器遇到这种代码应该如何操作,各种编译器都有自己的处置权,这就是“未定义行为”,没有答案的——这里解释了为什么我要封禁这类问题的原因,任何试图解释这类问题的答案都是错的,不要问、不要答,更不要写出这种代码。

[ 本帖最后由 TonyDeng 于 2013-4-1 09:47 编辑 ]

授人以渔,不授人以鱼。
2013-04-01 09:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 6楼 azzbcc
这类代码写成如下那样更清晰:
程序代码:
for (i = 0; i < n; ++i)
{
    printf("%d\n", s[i]);
}


这样,循环是干什么的,一目了然,而像你那种写法,就要眼珠转一转才翻译出来。

授人以渔,不授人以鱼。
2013-04-01 09:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不需过于从底层考虑,留意博主说的,是从哲学角度来说应如何写代码,到底层如何高效,编译器或运行时会自己解决,程序员的思维放在机器的角度,是很古老过时的意识了。当代的系统,有很多程序员不能、不需控制的成份,集中精力在抽象级别上解决问题,比干涉具体动作要好。

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



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

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