语句选择
在这里我们着重在选择程序可使用最多的循环和分支语句上。
1、分支语句
常用的 if(conditional) else语句;一般不建议超过三层嵌套if,如果筛选条件很多,可以使用 if(conditional) elseif else语句;
2、循环语句
最有效率的循环:for 语句;
if语句
if语句是Java语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式写if语句。本节以“与零值比较”为例,展开讨论。
布尔变量与零值比较
· 不可将布尔变量直接与1、0进行比较。
在Java中,bool类型变量分配boolean值(true、false), bool型和其它类型之间不能转换。
假设布尔变量名字为flag,它与零值比较的标准if语句如下:
if (flag) // 表示flag为真
if (!flag) // 表示flag为假
· 应当将整型变量用“==”或“!=”直接与0比较。
假设整型变量的名字为value,它与零值比较的标准if语句如下:
if (value == 0)
if (value != 0)
· 不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。
If语句的补充说明
程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序
if (condition)
return x;
return y;
改写为
if (condition)
{
return x;
}
else
{
return y;
}
或者改写成更加简练的
return (condition ? x : y);
Switch语句
switch是多分支选择语句,而if语句只有两个分支可供选择。虽然可以用嵌套的if语句来实现多分支选择,但那样的程序冗长难读。这是switch语句存在的理由。
switch语句的基本格式是:
switch (variable)
{
case value1 : …
break;
case value2 : …
break;
…
default : …
break;
}
· 每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。
· 不要忘记最后那个default分支。即使程序真的不需要default处理,也应该保留语句default : break; 这样做并非多此一举,而是为了防止别人误以为你忘了default处理。
循环语句的效率
Java循环语句中,for语句使用频率最高,while语句其次,do语句很少用。本节重点论述循环体的效率。提高循环体效率的基本办法是降低循环体的复杂性。
· 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如示例2-2 (b)的效率比示例2-2 (a)的高。
for (row=0; row<100; row++) { for ( col=0; col<5; col++ ) { sum = sum + a[row][col]; } } | for (col=0; col<5; col++ ) { for (row=0; row<100; row++) { sum = sum + a[row][col]; } } |
示例2-2(a) 低效率:长循环在最外层 示例2-2(b) 高效率:长循环在最内层
· 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。示例2-2 (c)的程序比示例2-2 (d)多执行了N-1次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果N非常大,最好采用示例2-2(d)的写法,可以提高效率。如果N非常小,两者效率差别并不明显,采用示例2-2 (c)的写法比较好,因为程序更加简洁。
for (i=0; i<N; i++) { if (condition) DoSomething(); else DoOtherthing(); } | if (condition) { for (i=0; i<N; i++) DoSomething(); } else { for (i=0; i<N; i++) DoOtherthing(); } |
表2-2(c) 效率低但程序简洁 表2-2(d) 效率高但程序不简洁
· 不可在for 循环体内修改循环变量,防止for 循环失去控制。
· 建议for语句的循环控制变量的取值采用“半开半闭区间”写法。
示例2-3(a)中的x值属于半开半闭区间“0 =< x < N”,起点到终点的间隔为N,循环次数为N。
示例2-3(b)中的x值属于闭区间“0 =< x <= N-1”,起点到终点的间隔为N-1,循环次数为N。
相比之下,示例2-3(a)的写法更加直观,尽管两者的功能是相同的。
for (int x=0; x<N; x++) { … } | for (int x=0; x<=N-1; x++) { … } |
示例2-3(a) 循环变量属于半开半闭区间 示例2-3(b) 循环变量属于闭区间
1.1. 缩进
源码缩进不仅仅使程序更美观,而且也使程序结构更清晰、易读。采用统一的Tab缩进方式
· 程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
· { }之内的代码块在‘{’右边数格处左对齐。
空格
· 关键词和操作符之间加适当的空格;
· 函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别;
· 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。
· 一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。
· 对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d))。
分行
· 相对独立的程序块与块之间加空行;
· 较长的语句、表达式等要分成多行书写。
· 划分出的新行要进行适应的缩进,使排版整齐,语句可读。
· 长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
· 循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分。
· 若函数或过程中的参数较长,则要进行适当的划分。
· 不允许把多个短语句写在一行中,即一行只写一条语句。
· 函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格。
· Java/JavaScript语言是用大括号‘{’和‘}’界定一段程序块的,编写程序块时‘{’和‘}’应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
1.2. 注释
参见
<< 2_G_开发指南_Java编码规范>>