博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《你的月亮我的C》(二):代码风格:选择更好的条件和结构
阅读量:302 次
发布时间:2019-03-03

本文共 4594 字,大约阅读时间需要 15 分钟。

评判代码风格良好的标准很多且不统一,从客观的角度来看,好的代码风格应该是清晰明了的,将代码用一种适当的结构配合简明的语句来表达出你的思路,这很大程度上取决于程序员的逻辑思维能力。良好的代码风格这里分成两大部分:更好的条件语句和更好的代码结构。

一、选择更好的判断条件

1、continue语句可以通过改变if条件来省略。

具体看个例子:

#include 
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 
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;	}

2do....while语句通常可以改为while语句。

比如这个例子:

#include 
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 
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 
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 
int main(int argc, char const* argv[]){ int digit=0; while (digit!=-1) { scanf("%d", &digit); } return 0;}

3、嵌套越多层的if语句越容易出问题,可以一次把每个条件列出来。

例如这样:

#include 
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;}

程序的意思是说:当ABC都大于0时,digit等于9527A小于0BC大于0时,digit等于952AC都小于0只有B大于0时,digit等于95

这样的代码看起来很乱,要完全读懂费时间。而且层层嵌套,通常到了最里面层嵌套后,容易忘记外面的条件(特别是for循环)。所以可以尝试在if判断时就把可以列出的条件一次全部列出来。

#include 
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 
#define MaxSize 100int main(int argc, char const* argv[]){ int digit,i,num; num=100; digit=i=0; while (i
1) { i++; continue; } digit++; } printf("%d", digit); return 0;}

If....continue结构可以改成if....else结构达到同样的效果,代码这样写更易懂(毕竟if....else天生一对嘛)

#include 
#define MaxSize 100int main(int argc, char const* argv[]){ int digit,i,num; num=100; digit=i=0; while (i
1) { i++; } else { digit++; } } printf("%d", digit); return 0;}

改完后,我们继续看代码,进入循环有两个条件,其中一个是!digit。从下面可以看出,只要if的条件是成立的,digit就不会++,也就是digit不会变成!digit。既然退出循环的条件和if有关,我们可以尝试下通过if来判断循环的继续和退出,也就是这样改:

#include 
#define MaxSize 100int main(int argc, char const* argv[]){ int digit,i,num; num=100; digit=i=0; while (i
1) { i++; } printf("%d", digit); return 0;}

当然这样改后,不需要digit来做退出循环的判断条件,最后输出的digit就还是等于0了。

if....return也可以改成if....else结构。

#include 
#define MaxSize 100int 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 
#define MaxSize 100int 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 
#define MaxSize 100int 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;}

jk可以改成自己输入。

可以试下改成这样:

#include 
#define MaxSize 100int 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;}

转载地址:http://bvtm.baihongyu.com/

你可能感兴趣的文章