2、建议for 语句的循环控制变量的取值采用“半开半闭区间”写法。
半开半闭区间写法和闭区间写法虽然功能是相同,但相比之下,半开半闭区间写法写法更加直观。
3、不能在for 循环体内修改循环变量,防止循环失控。
4、循环要尽可能的短,要使代码清晰,一目了然。
如果你写的一个循环的代码超过一显示屏,那会让读代码的人发狂的。解决的办法由两个:第一,重新设计这个循环,确认是否这些操作都必须放在这个循环里;第二,将这些代码改写成一个子函数,循环中只调用这个子函数即可。一般来说循环内的代码不要超过20行。
5、把循环嵌套控制在3 层以内。
国外有研究数据表明,当循环嵌套超过3 层,程序员对循环的理解能力会极大的降低。如果你的循环嵌套超过3 层,建议你重新设计循环或是将循环内的代码改写成一个字函数。
11. C语言goto关键字—尽量少用
一般来说,编码的水平与goto 语句使用的次数成反比。有的人主张慎用但不禁用goto语句,但我主张禁用。关于goto 语句的更多讨论可以参看Steve McConnell 的名著《CodeComplete. Second Edition》。
禁用goto 语句。自从提倡结构化设计以来,goto 就成了有争议的语句。首先,由于goto 语句可以灵活跳转,如果不加限制,它的确会破坏结构化设计风格;其次,goto 语句经常
带来错误或隐患。它可能跳过了变量的初始化、重要的计算等语句,例如: struct student *p = NULL; … goto state;
p = (struct student *)malloc(…); //被goto 跳过,没有初始化 … state:
//使用p 指向的内存里的值的代码 …
如果编译器不能发觉此类错误,每用一次goto 语句都可能留下隐患。
12. C语言void关键字
void 有什么好讲的呢?如果你认为没有,那就没有;但如果你认为有,那就真的有。有点像“色即是空,空即是色”。
一、void a?
void 的字面意思是“空类型”,void *则为“空类型指针”,void *可以指向任何类型的数据。
void 几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void 变量,看看下面的例子: void a;
Visual C++6.0 上,这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a 的编译不会出错,它也没有任何实际意义。 void 真正发挥的作用在于: 1. 2.
众所周知,如果指针p1 和p2 的类型相同,那么我们可以直接在p1 和p2 间互相赋值;如果p1 和p2 指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。例如: float *p1;
对函数返回的限定; 对函数参数的限定。
int *p2; p1 = p2;
其中p1 = p2 语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为: p1 = (float *)p2;
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换: void *p1; int *p2; p1 = p2;
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“空类型”可以包容“有类型”,而“有类型”则不能包容“空类型”。比如,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。下面的语句编译出错: void *p1; int *p2; p2 = p1;
提示“'=' : cannot convert from 'void *' to 'int *'”。
二、void 修饰函数返回值和参数
1、如果函数没有返回值,那么应声明为void 类型。在C 语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void 类型。例如:
add ( int a, int b ) {
return a + b; }
intmain(int argc, char* argv[]) //甚至很多人以为main 函数无返回值 //或是为void 型的 {
printf ( \}
程序运行的结果为输出: 2 + 3 = 5。这说明不加返回值说明的函数的确为int 函数。
因此,为了避免混乱,我们在编写C 程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void 类型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上void 类型声明后,也可以发挥代码的“自注释”作用。所谓的代
码的“自注释”即代码能自己注释自己。
2、如果函数无参数,那么应声明其参数为void。在C++语言中声明一个这样的函数: int function(void) {
return 1; }
则进行下面的调用是不合法的:function(2);
因为在C++中,函数参数为void 的意思是这个函数不接受任何参数。但是在Turbo C 2.0 中编译:
#include \fun() {
return 1; } main() {
printf(\ getchar(); }
编译正确且输出1,这说明,在C 语言中,可以给无参数的函数传送任意类型的参数,但是在C++编译器中编译同样的代码则会出错。在C++中,不能向无参数的函数传送任何参数,出错提示“'fun' : function does not take 1 parameters”。所以,无论在C 还是C++中,若函数不接受任何参数,一定要指明参数为void。
三、void 指针
1、千万小心又小心使用void 指针类型。按照ANSI(American National Standards Institute)标准,不能对void 指针进行算法操作,即下列操作都是不合法的: void * pvoid;
pvoid++; //ANSI:错误 pvoid += 1; //ANSI:错误
ANSI 标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。也就是说必须知道内存目的地址的确切值。例如: int *pint;