有些程序员总喜欢使用精简而紧凑的C语句,以为可以提高程序效率,或者单纯只为显示自己掌握高深的语法,如:
return ((int)atou(str+((*str == ‘+’)?1:0)));
这种写法简直让人抓狂,难道写点能让人看懂的代码很羞耻么?“? :”运算符效果等同于if-else语句,完全能分解得更直观:
if(*str == '+') str++;
return ((int)atou(str));
要知道,尽管C代码和相应机器码在统计意义的数量上存在一定比例关系,但并不适用于局部或单行代码,所以把原本简洁的多行代码硬挤在一行(“一行清”病)没有任何好处。写程序和写合同是两回事,故作高深地弄出一些稀奇古怪的表达方式,只会增加别人读代码的负担,招骂。尽量按正常人思维写代码吧,把令人费解的“技巧”统统丢到垃圾桶去,如:
避免过于复杂的条件判断,包括:
1)避免条件语句中的赋值操作,如:if(a=fun()) {……} 写成下面这样更清楚,且不宜出错:
a=fun();
if(a) {……}
2)避免用所谓短路求值简化条件语句,
短路计算是一种策略,对于多个子表达式构成的复合表达式,如果多个子表达式的计算顺序确定,那只要前n个子式能确定整体表达式的值,剩余子式就不再计算。比如:
if(*sdtr != ‘+’){
if(str++){
return ((int)atou(str));
}
}
就可以利用短路求值,把两行if语句用“&&”操作符改成一行,即:
if( (*sdtr != ‘+’) && str++ )
return ((int)atou(str));
尽管基于C的短路求值规则,这两种写法等效,但集中代码到一行并不比用多条if语句更高效,却无疑使可读性更差,因而不可取,不如按部就班使用双层if语句。
3) 尽量避免用“否定”方式的条件语句,如:
if(!((ca<’0’)||(ca>’9’)))可改为if((ca>=’0’)&& (ca<=’9’) ),因为取反的条件逻辑上更多了一步,脑子里要打个转,不如正面判断合乎习惯,更加自然。
尽量少使用 ^=, /=等运算符,特别是位运算,而加减乘除和=号的结合用得比较多,多数人已习惯了。
避免多赋值语句,如x = y = z。
少使用位域,用掩码位操作代替。
总之原则是:多动手,避免绕来饶去用脑,用脑要在关键的地方。