《你的月亮我的C》(二):代码风格:选择更好的条件和结构

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

一、选择更好的判断条件

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

2do....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;
}

程序的意思是说:当ABC都大于0时,digit等于9527A小于0BC大于0时,digit等于952AC都小于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;
}

jk可以改成自己输入。

可以试下改成这样:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值