评判代码风格良好的标准很多且不统一,从客观的角度来看,好的代码风格应该是清晰明了的,将代码用一种适当的结构配合简明的语句来表达出你的思路,这很大程度上取决于程序员的逻辑思维能力。良好的代码风格这里分成两大部分:更好的条件语句和更好的代码结构。
一、选择更好的判断条件
1、continue语句可以通过改变if条件来省略。
具体看个例子:
#include <stdio.h>
int main(int argc, char const* argv[])
{
int digit=0;
while (1) {
scanf("%d", &digit);
if (digit!=-1) {
continue;
} else {
digit=9527;
break;
}
}
printf("%d", digit);
return 0;
}
从第7行到第15行,程序要做的是不停输入值赋给digit,直到输入-1后,digit赋值9527,然后退出while循环。看似很简洁明了了,但有没有办法让它更简洁更高效?
可以通过把if条件“取反”来省略掉continue语句,从而省掉一些不必要的代码量。
#include <stdio.h>
int main(int argc, char const* argv[])
{
int digit=0;
while (1) {
scanf("%d", &digit);
if (digit==-1) {
digit=9527;
break;
}
}
printf("%d", digit);
return 0;
}
意思是我们可以把if的条件反过来(求非)。
while (A) {
if (B) {
continue;
}
} else {
C;
}
/*可以改成这样的结构*/
while (A) {
if (!B) {
C;
}
}
/*可以写的更简洁*/
while (A) {
if (!B) C;
}
2、do....while语句通常可以改为while语句。
比如这个例子:
#include <stdio.h>
int main(int argc, char const* argv[])
{
int digit=0;
do {
scanf("%d", &digit);
if (digit!=-1) {
continue;
} else {
printf("%d", digit);
break;
}
} while (digit!=-1);
return 0;
}
首先我们可以把里面的continue消掉:
#include <stdio.h>
int main(int argc, char const* argv[])
{
int digit=0;
do {
scanf("%d", &digit);
if (digit==-1) {
digit=9527;
break;
}
} while (digit!=-1);
return 0;
}
然后再把do....while语句中while的条件语句之间用while:
#include <stdio.h>
int main(int argc, char const* argv[])
{
int digit=0;
while (digit!=-1) {
scanf("%d", &digit);
if (digit==-1) {
printf("%d", digit);
break;
}
}
return 0;
}
接着我们看到第9到第11行,用一个if来实现退出while循环的条件多余了,所以可以把if条件去掉
#include <stdio.h>
int main(int argc, char const* argv[])
{
int digit=0;
while (digit!=-1) {
scanf("%d", &digit);
}
return 0;
}
3、嵌套越多层的if语句越容易出问题,可以一次把每个条件列出来。
例如这样:
#include <stdio.h>
int main(int argc, char const* argv[])
{
int digit=0;
int A,B,C;
scanf("%d %d %d", &A, &B, &C);
if (A>0) {
if (B>0) {
if (C>0) {
digit=9527;
}
}
} else if (B>0) {
if (C>0) {
digit=952;
} else {
digit=95;
}
}
printf("%d", digit);
return 0;
}
程序的意思是说:当A,B,C都大于0时,digit等于9527;A小于0但B和C大于0时,digit等于952;A和C都小于0只有B大于0时,digit等于95。
这样的代码看起来很乱,要完全读懂费时间。而且层层嵌套,通常到了最里面层嵌套后,容易忘记外面的条件(特别是for循环)。所以可以尝试在if判断时就把可以列出的条件一次全部列出来。
#include <stdio.h>
int main(int argc, char const* argv[])
{
int digit=0;
int A,B,C;
scanf("%d %d %d", &A, &B, &C);
if (A>0 && B>0 && C>0) {
digit=9527;
} else if (A<0 && B>0 && C>0) {
digit=952;
} else if (A<0 && B>0 && C<0) {
digit=95;
}
printf("%d", digit);
return 0;
}
二、选择更好的代码结构
1、if....continue结构可以改成if....else结构,退出循环的条件可以通过if的条件来代替。
看下这个程序:
#include <stdio.h>
#define MaxSize 100
int main(int argc, char const* argv[])
{
int digit,i,num;
num=100;
digit=i=0;
while (i<MaxSize && !digit) {
if ((num/=2)>1) {
i++;
continue;
}
digit++;
}
printf("%d", digit);
return 0;
}
If....continue结构可以改成if....else结构达到同样的效果,代码这样写更易懂(毕竟if....else天生一对嘛)
#include <stdio.h>
#define MaxSize 100
int main(int argc, char const* argv[])
{
int digit,i,num;
num=100;
digit=i=0;
while (i<MaxSize && !digit) {
if ((num/=2)>1) {
i++;
} else {
digit++;
}
}
printf("%d", digit);
return 0;
}
改完后,我们继续看代码,进入循环有两个条件,其中一个是!digit。从下面可以看出,只要if的条件是成立的,digit就不会++,也就是digit不会变成!digit。既然退出循环的条件和if有关,我们可以尝试下通过if来判断循环的继续和退出,也就是这样改:
#include <stdio.h>
#define MaxSize 100
int main(int argc, char const* argv[])
{
int digit,i,num;
num=100;
digit=i=0;
while (i<MaxSize && (num/=2)>1) {
i++;
}
printf("%d", digit);
return 0;
}
当然这样改后,不需要digit来做退出循环的判断条件,最后输出的digit就还是等于0了。
if....return也可以改成if....else结构。
#include <stdio.h>
#define MaxSize 100
int main(int argc, char const* argv[])
{
int digit,i,num;
char c;
scanf("%d", &digit);
if (digit<70) {
c='D';
return;
}
if (digit<80) {
c='C';
return;
}
if (digit<90) {
c='B';
return;
}
if (digit>90) {
c='A';
return;
}
return 0;
}
可以改成if....else结构:
#include <stdio.h>
#define MaxSize 100
int main(int argc, char const* argv[])
{
int digit,i,num;
char c;
scanf("%d", &digit);
if (digit<70) {
c='D';
} else if (digit<80) {
c='C';
} else if (digit<90) {
c='B';
} else if (digit>90) {
c='A';
}
return 0;
}
3、用问号表达式使代码更简练更清楚。
比如看这个:
#include <stdio.h>
#define MaxSize 100
int main(int argc, char const* argv[])
{
int digit,i,g,j,k,result;
j=k=10;
scanf("%d %d %d", &digit, &i, &g);
if (digit!=0) {
if (j>k) {
result=j/i;
} else {
result=k/i;
}
} else {
if (j>k) {
result=j/g;
} else {
result=k/g;
}
}
printf("%d", result);
return 0;
}
j和k可以改成自己输入。
可以试下改成这样:
#include <stdio.h>
#define MaxSize 100
int main(int argc, char const* argv[])
{
int digit,i,g,j,k,result;
j=k=10;
scanf("%d %d %d", &digit, &i, &g);
if (j>k) {
result=j/(digit!=0? i:g);
} else {
result=k/(digit!=0? i:g);
}
printf("%d", result);
return 0;
}