C语言易错点总结
1.sizeof是关键字而非函数。
2.定义变量时,不能同时对多个变量连续赋初始值。
eg:int m=n=1;//错误
3.scanf语句:
“%c"将读入空白符,” %c"能忽略空白符。
"%s"遇到空白符读入结束。
ps:要想将有空格的字符串存入char型数组中,可使用gets(str) 或fgets(str,size,stdin)从标准输入设备中读入。但不建议使 用危险的gets(str),因为它无法限制输入字符串的长度,容易导致缓冲区溢出。两者的读入有所区别,fgets()读入换行符会将换行符作为字符串的一部分。
scanf语句中没有精度修饰符。
scanf语句输入数值时,读入结束的几种情况:
1)遇到空白符
2)达到域宽
3)遇到非法输入
scanf语句的返回值为读入的项数。未能成功读入返回0,调用函数失败或读到文件结束返回EOF(值为-1的宏)。
4.小心&&与||的短路特性。
eg:
int a=1;
int b=2;
if(a<0&&b++>2)//b++不会被执行
a+=2;
5.空指针不能解引用。
6.函数的返回值可以是除了数组之外的任何类型。
7.数组名是一个地址,不能改变。
eg:
int a[3]={1,2,3};
int *p=a;
printf("%d",*(a+1));//合法
printf("%d",*(++a));//不合法
printf("%d",*p);//合法
printf("%d",*(++p));//合法
8.共用体不能进行比较操作,也不能作为函数参数。
9.局部变量可以屏蔽全局变量(就近原则)。
10.同一个外部变量名在两个不同的文件中被声明为不同的类型,会导致C程序失效。
11.使用宏定义完成类似函数的功能时,要注意括号的使用。
eg:#define cube(a) a*a*a//不好
当函数中调用cube(a+b)时,计算的将是(a+(b*a)+(b*a)+b)
的
值。
改进:#define cube ((a)*(a)*(a))