1.一个常见的编程错误是假设函数能改变变量的值。因为在C中函数是严格遵循按值调用的,所以在调用环境中不可能通过用变量作为参数调用来改变变量的值。
如: f()是函数,V是变量,那么f(V)在调用环境中不能改变变量V的值
如果f()中返回一个值,令V=f(V),则能够改变变量的值。
2.在main()函数中使用return和exit()是等价,均能是函数返回值到宿主函数,并实现程序的正常结束。但是在其他的函数中exit()就不同于return,因为exit()在返回一个值到宿主函数之后,还要终止函数的执行。返回值为0时表示函数正常的终止,返回非0值时表示非正常终止,函数执行会有遗留问题。
3.编写递归函数的终止条件容易犯错,这类错误经常导致死循环。
例如:
#include<stdio.h>
int main(void){
int count=0;
if(++count<77){
printf("&&&&&&&&&&&&&&&");
main();
}
return 0;
}
这个例子在每次调用main函数时都将count初始化为0,出现死循环是不可以避免的,如果在main函数声明是使用静态声明则可以避免这种现象的发生。static int count 在每次调用main函数时就不会变量count初始化了。
4.由于传统C没有函数原型,所以在ANSI C中编写一个没有函数原型的程序,传递给函数的实参就得不到保证,意味着不会进行类型检查或类型转换。在ANSIC中的函数原型的类型安全特征是很强大的,一致的使用函数原型能够获得很大的好处。