c程序注意问题...
时间:2010-08-12 来源:liubin15989534919
一、C程序一般遵循的习惯
1、习惯上,将主函数 main()放在程序文件的最前面,而其它函数只在其前面进行声明。
2、对所有要求成对出现的符号,如“{}”、“()”、“/* */”等,在输入时,均成对输入,然后再在其中插入需要的内容,这样可以避免遗忘,减少不必要的程序调试。
3、习惯上,变量名及函数名使用小写,而字符常量使用大写。
4、尽量选择具有含义的英文单词作为变量名及函数名,这样对程序的维护非常有好处,能不使用缩写尽量不要使用缩写,即使采用缩写,也要做到可以望文生义。
5、良好的习惯:在双目运算符的左右两侧各加一个空格,可以增强程序的可读性。
6、为了使程序具有良好的可读性并减少出错,凡不要求返回值的函数,都应定义返回为空(void),即使函数类型为整型,也不使用系统的缺省处理(系统缺省会返回一个不确定的值)。
如:void function(void)
{
/****函数体****/
}
7、使用悬空指针很容易破坏系统,所以要避免。
8、全局变量可以作为函数之间传递参数的一个手段,但是全局变量太多时,会使内存开销变大,并且,全局变量在同时操作时会出现问题,所以,应该尽量少使用全局变量。
9、尽量避免在混合表达式中使用自加或者自减运算是写程序的良好习惯,因为有些环境下是右结合性,有些环境下却是左结合性,这样会造成运算结果的不确定性。
10、在写浮点常量时,最好还是将它们写成带小数点,即使该浮点常量取的是整数值,因为这样可以强调其浮点性,便于别人阅读。
二、在编写C语言程序时应该注意的一些问题
1、加分号(;)与不加分号。
1)在C语言中,分号代表一条语句的结束,所有语句必须以分号结束,即使是最后一条语句也不例外。
2)这里一定不要忘记加分号。
do
{
/*循环体*/
}while(循环条件); //是这里了:)
3)宏定义部分不能加分号。
如:#incllude <stdio.h>
#define SUCC 0
#ifndef _FUNC_H
#define _FUNC_H
#endif
4)函数的说明部分不可以加分号。
如:int function(int) //注意:这里没有分号
{
函数体;
}
5)这里也没有分号:
for(i=0;i<10;i++ ) //小括号的后面
while(num<10) //这里也一样没有
6)不要混淆:
while(循环条件);
注意:这里的分号是指while循环的循环体是一个空语句,当然这种写法很不好,但是没有错误。
7)还有就是if()、switch()等语句的小括号后面都不能加分号。
2、标识符
1)
C语言的标识符必须以字母或下划线开头,并且由字母、数字和下划线组成。
关键字有系统保留,不能作为变量名。
标识符的有效长度因系统而异。
C语言对大小写敏感。
2)通用规则:在所以可以使用某个类型的变量的值的地方,都可以使用该类型的更复杂的表达式。
3、系统在存储字符串时,会自动加上一个'\0'作为字符串的结束符,因此,一个字符串在存储时要比实际多占用一个字节空间。
4、强制数据类型转换,只是得到一个所需要的中间量,而被要求进行强制转换的原表达式的类型并不发生变化。
5、在C语言中,整形和字符型数据可以互相转换输出,系统首先求该数与256的余数,然后将余数作为ASCII码转换成相应的字符输出。
6、switch(表达式)
这里的“表达式”,只可以是int,char或枚举类型中的一种。
7、break语句和continue语句
1)break语句只对循环和switch语句有效,continue语句只对循环语句有效。
2)循环嵌套时,break和continue语句只影响包含它们的最内层循环,与外层循环无关。
8、数组
1)数组定义中的“下标表达式”的值表示数组中的元素个数,而并不是数组的最大元素的下标。
2)数组元素的下标,是元素相对于数组起始地址(首地址)的偏移量,所以从0开始顺序编号。
3)数组名中存放的是一个地址常量,它代表整个数组的首地址,即数组中第一个元素的地址。同一个数组中的所有元素,按其下标顺序占用一段连续的存储单元。
4)C语言不允许动态定义数组。
如:int array[];
char s[];
都是错误的,编译检查无法通过。
5)C语言系统不自动检测数组元素的下标是否越界,因此,程序员保证下标不越界是很重要的!!!!!
9、C语言规定函数定义不允许嵌套,即在一个函数的函数体内,不能再定义另一个函数。
10、如果函数没有return语句,并不是代表函数不返回值,而是返回一个不确定的值。所以为了明确表示不返回值,可以用void定义。
11、指针和指针变量
1)一个变量的地址即称为该变量的指针,通过变量的指针能够找到该变量。
2)专门用来存储其它变量地址的变量称为指针变量。
3)指针变量本身有自己的地址,这和其它类型的变量没有区别。但是,指针变量只能用来存放地址。
4)指针声明时的"*"和指针运算符的"*"是两个截然不同的概念。
12、"&"和"*"运算符
1)"&"运算符是一个返回操作数地址的单目运算符
2)"*"运算符是对"&"运算符的一个补充,它返回位于这个地址内的变量的值,也是单目运算符。
13、数组与指针有密切关系。数组名本身就是该数组的指针,反之,也可以把指针看成一个数组。数组名和指针实质上都是地址,但是,必须注意,指针是变量,而数组名是常量。
如:int array[10],*p;
p=&a;
p++; //正确,因为p是变量,可以进行自增运算
a++; //错误,因为a是常量,不能进行自增运算
14、scanf()的问题
当使用多个scanf()函数连续接收多个字符变量输入时,会存在scanf()函数将"空格"或"回车"符接收进来的情况,而使字符变量内存入了我们不需要的值。
对于这个问题,可以有如下的解决方法:
1)scanf(" %c",ch); //在"%c"的前面故意留一个空格
2)scanf("%c",ch1);
fflush(stdin); //加入一行清除输入缓冲的操作
scanf("%c",ch2);
15、结构变量名不是指向该结构的地址,这与数组名的含义不同。因此,若要取结构中第一个成员的地址,应表示为:
&[结构变量名]。
16......