c语言笔记易错点
C语言笔试易错知识点

C语言笔试易错知识汇总作者:毛志敏Email:wuxin0529@一、数据类型1、有符号数与无符号数的差异例如:unsigned int i;for(i=5; i>=0; i--){printf ( "%d ", i);}此题为一个死循环输出,但是大家往往没注意到无符号数,导致错误的认为输出是5 4 3 2 1 02、整型与浮点型的差异整型的除法与浮点型除法的差异浮点型不支持求余操作,应注意整型数据之间进行==、>、<操作,可直接拿两个数相比,但是浮点型数据由于精度问题却不能直接相比,如果需要判断两个浮点型数据是否相等,可以如下操作if ( abs(x-y) < 0.000000001)3、各类型混合运算如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。
double ←── float 高↑long↑unsigned↑int ←── char,short 低不管最后结果如何,都会自动转换成赋值运算符左值的类型二、关键字1、switch case强烈提醒大家注意case后面有没有break,小心case穿透。
2、static声明静态变量,该类型变量在整个程序里只有一次初始化,然后便一直生存直到整个程序结束。
笔试中常有如下题目#include <stdio.h>int fun(int n){static int s = 0;s += n;return s;}void main(){int i;int sum = 0;for (i=0; i<5; i++){sum += fun(i);}printf("%d", sum);}此题目在主函数的for循环中多次调用fun函数,当第一次调用的时候,fun函数中的static变量s初始化为0,首次函数执行完后返回0(sum = 0);当第二次调用fum 函数时传入参数1,此时s已经存在,不需要初始化,函数返回1(sum = 1);同理第三次函数返回3(sum=4),第四次函数返回6(sum=10),第五次函数返回10(sum=20)。
C语言易错点归纳

C语言易错点归纳注:1)不考内容:条件编译、内部外部函数、位运算、共用体、枚举、typedef、ftell 2)并非所有内容都要完全掌握,大家自行把握3)本文档内容有任何问题一定要尽快联系刘子恒!三上里穂作品番号2015AVOP-152 シ十物語~AV女優に逢いたくて~ 2015-09-01AUKG-298 嫁姑レズ~百合の血族~三上里穂杉本美奈代 2015-08-01 AGEMIX-275 顔騎手コキ~次々と溢れ出る愛液をじゅるつきながらシゴかれる世界~ 2015-07-17AGEMIX-274 よつんばいフェラ6 ~フル勃起ち○ぽへの従属を姿勢で示す女たち~ 2015-07-17T28-405 満員電車でハメたがる発情痴女 2015-06-26TOMN-015 意識朦朧激ハードピストンSEX 2015-06-19DTRS-010 姉妹スワッピング 2015-06-01CESD-119 ドスケベ痴女の強制チンポ狩り12時間責められ好きな貴方に贈る至福の強制快楽射精100シーン 2015-05-25T28-401 「あなたがイクまでずっと見てる。
」いろんな場所で14人の美女たちがしてくれる極上ベロフェラ! 2015-05-22TOMN-012 鉄板フェラチオBEST Vol.2 2015-04-19YST-41 ナマ姦不倫10 2015-04-04MDYD-993 浮気をする日はノーパンです三上里穂 2015-02-13CESD-095 我を忘れるほど感じる失禁ディルド本気モードオナニー11人 2015-02-13YSN-422 僕が見ているのを気が付かないほどオナニーに熱中している母に「母さん、何してるの?」とわざとらしく聞いたらかなり動揺して「父さんには内緒にして」と即フェラしてくるもんだから調子に乗って色々、母と変態行為しちゃった件(笑) 2015-01-09第三章1、标识符:你给变量、宏、函数、结构体等起的名字。
单片机C语言易错知识点

单片机C语言易错知识点
1. !和~ 不一样
! 是逻辑非符号,~ 是位取反符号。
对IO口某个管脚赋值时不要错用!,如
2.<<和>>的优先级低于+、-
比如要实现c=x*2+1,没有加括号会出错
3.移位要防止溢出
其实用移位代替乘除法是个不错的方法,笔者很喜欢拿到一段代码后用移位代替乘除法来进行优化。
不过有时候却会出现问题,比如溢出问题。
当很明显可能溢出的话我们是会注意的,比如
但是有时候这个问题是不明显的,比如当移位出现在数组索引或函数参数时,有段用液晶显示字符的代码如下
我们可以用左移运算来代替乘法进行优化,如
这本是一个好方法,但是事实上上面的代码是错的。
当执行c<<4时,因为没有明显的赋值过程,我们可能认为没问题,而事实上c的高位已经丢失了,所以得到错误的结果。
一个可行的做法是先进行强制转换,如
4.无符号数和有符号数混合运算都会被强制转换为无符号数运算
当一个有符号数和一个无符号数进行算术运算时,系统会自动将有符号数强制转换为无符号数再进行运算(即使你使用有符号数强制类型转换),如下面两种写法的运输结果是一样的
5.局部变量要初始化
局部变量没有初始化的话,因为单片机每次为他分配的是同一个内存区域,当你在函数中是这么使用局部变量时,就可能出问题:
如果第一次调用fun时,a传递的值为0,那么flag = 0x01;执行
if(flag&0x01)后面的代码。
以后再调用fun时,即使a不为0,但flag依然使用之前的内存区域,所以其值一直为0x01,一直执行的是if后面的代码,而不是else后面的。
C语言易错点 (1)

C语言的最大特点是:功能强、使用方便灵活。
C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。
看着有错的程序,不知该如何改起,一些高手通过对C的学习,积累了一些C编程时常犯的错误,与各位学员一起分享。
~~~~~~~~~~~1.书写标识符时,忽略了大小写字母的区别。
代码main(){int a=5;printf("%d",A);}编译程序把a和A认为是两个不同的变量名,而显示出错信息。
C认为大写字母和小写字母是两个不同的字符。
习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
2.忽略了变量的类型,进行了不合法的运算。
代码main(){float a,b;printf("%d",a%B);}%是求余运算,得到a/b的整余数。
整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。
3.将字符常量与字符串常量混淆。
代码char c;c="a";在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。
C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的。
4.忽略了“=”与“==”的区别。
在许多高级语言中,用“=”符号作为关系运算符“等于”。
如在BASIC程序中可以写代码if (a=3) then …但C语言中,“=”是赋值运算符,“==”是关系运算符。
如:代码if (a==3) a=b;前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。
由于习惯问题,初学者往往会犯这样的错误。
5.忘记加分号。
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
C语言复习易错点总结

else y=0; 解 : y=(x>0?1:x<0?-1:0) 与 y=(x>0?1:(x<0?-1:0))等价。 2. 关于赋值表达式,将赋值号"="右侧表 达式的值赋给赋值号左边的变量。赋值表 达式的值为执行赋值后被赋值的变量的 值。形如 a=b ,b 会被转换为符合 a 的类 型,如果不能转换,要么报警告,要么报
} printf(“%d”,s); }t=1 应该放在第三行 此程序看似正确,可是运行结果却不对, 原因也是在 t=1 这个赋值语句,它的位置 应该在外层循环的里面,而不是在外面。 这种错误,对于初学者来讲,很容易犯, 却又发现不了,在程序调试的时候会浪费 很多时间,又会影响编程的自信心。 1.9 数组和整型或者实型变量不能重名 例如: main() { int a[10],a;…} 数组名为 a,其他变量的名字就不能再用 a。 1.10 数组输出时的错误 例如:现在想输出数组 a 中的所有数值。 int a[10]={1,2,3,4,5,6},i; for(i=0;i<10;i++) printf(“%d”,a[10]); 这个程序看似输出数组的十个元素,其实 只输出其中的一个元素。解决此类问题的
if(s==i) printf(“%d”,i); }是不是这样每一次循环 s 都变了?
程序运行的结果预期是 6 和 28,可是 实际上却没有任何结果。原因就是 s=0 这 个语句放错了位置,应该放在外层循环里 面,也就是每判断一个数都应该从 0 开始 累加。 再如:求 1!+2!+……+100! main() { int i,j,s=0,t=1; for(i=1;i<=100;i++) { for(j=1;j<=i;j++) t=t*j;s+=t;
c语言笔记易错点

1:排序函数不需要返回值/*=====================================本函数用于对数组从小到大排序参数说明:a[]表示待排序数组的首地址;num表示数组长度i,j是循环变量;k用于记录每轮比较的最小值下标;temp是交换临时变量返回值:无=====================================*/void sort(int a[],int num){int i,j,k,temp;for(i=0;i<num;i++) //选择法排序{k=i;for(j=i+1;j<num;j++){if(a[j]<a[k])k=j;}temp=a[i];a[i]=a[k];a[k]=temp;}}错误int queue(int array2[n]) //定义为数组排序的函数{int i,j,temp;for(i=0;i<=n-2;i++) //选择法排序for(j=i+1;j<=n-1;j++){if(array2[i]>array2[j]) //交换数组的值{temp=array2[i];array2[i]=array2[j];array2[j]=temp;}}}return(array2[n]);//此返回值的意义是什么?为什么程序运行成功?【此返回值其实已经溢出了,通过调试函数可以看出】/*===========================================本函数用于将数组中的元素值作为ACSII码生成字符串,并对应存储输入的字符数组中。
参数说明:a[]数组作为ACSII码;num表示数组长度;str[]用于储存形成的字符串;返回值:无============================================*/此时不需要返回值所以不需要定义函数的类型,为空即可;void ACSIIstr(int a[],int num,char str[]){int i;for(i=0;i<num;i++){str[i]=a[i];}}The variable 'num' is being used without being initialized.到底是毛意思啊int panduan(char str1[],char str2[]){int i=0,j=0,k=0,len1,len2,num=0;{如果这里写成num,就会出现:还有一种情况则是未加&The variable 'num' is being used without being initialized.}while(j>=0){if(str1[j]==0)break;如果此处写成str1[j]==’0’,那么此处的循环成为死循环。
初学C语言的人最容易犯的错误集锦

初学C语言的人最容易犯的错误集锦(一)下面这些错误如果你不能一眼看出来,那么就需要非常注意这些细节了。
这些错误虽然都很小,但是经常能让一个初学者郁闷好几天。
我们将分析这些错误并给出避免出错的建议。
错误1#include <stdio.h>void main(){int i;for (i=1;i<=200;i++)if(i%7==0) ;printf("%3d",i) ;}程序编写者的本意是打印所有能被7整除的数,但是每次运行的时候只会打印一个0,为啥呢?你看出来了吗??????????????????????if语言后多了分号!这位同学本来是想在(i%7==0)等于true的时候执行printf语句的,但是分号是一段代码的终止标志,所以if只会执行空的代码体,所以if(i%7==0) ;printf("%3d",i) ;相当于:if(i%7==0){};printf("%3d",i) ;可以看到printf根本没有被包含到if的大括号中。
正确的代码应该是:#include <stdio.h>void main(){int i;for (i=1;i<=200;i++)if(i%7==0)printf("%3d",i) ;}杨中科老师的建议是哪怕只有一行代码,也要使用大括号,所以更好的代码是:#include <stdio.h>void main(){int i;for (i=1;i<=200;i++){if(i%7==0){printf("%3d",i) ;}}}错误2#include <stdio.h>int main(int argc, char *argv[]){int i=333;if(i%2==0){printf("偶数");};else{printf("奇数");}return 0;}上面的代码编译的时候会报下面的错误:error: syntax error before "else"在if语句中,如果有else子句,则在if后不应该使用分号。
c语言重点知识点及易混知识

易混及容易出考题的知识点1.变量的命名规则:(1)由英文字母、数字和下划线组成,其必须以英文字母或下划线开头;(2)不允许使用关键字作为标识符的名字;(3)标识符命名应做到“见名知意”;(4)标识符区分大小写。
2.在给自己定义的变量或函数取名时,不能用C语言的关键字,因此务必记住 C 语言的常见关键字(如main, if, else, for, switch, break, continue, typedef l include)3.注意运算符的优先级,例如赋值运算符V关系运算符V算术运算符4.进行逻辑运算操作时,如果&&的左侧已经为0,则其右侧的表达式不再计算,相似地,如果Il的左侧已经为1,则其右侧的表达式不再计算1.1f选择语句,注意在条件表达式的后面不要加分号,如下面的语句在语法上和逻辑上都是对的if (条件表达式)语句但if(条件表达式);语句在语法上没问题,但逻辑上就是错的,因为条件表达式的后面的分号可以看作是一个空语句,这个if语句的逻辑就是如果表达式成立,则什么也不做。
另外,if (a=0)语法上没问题,但逻辑上是错的,正确的写法应该是if (a==0)或if (0==a)6.注意if与else的配对,CISe总是与它最前面的if配对7.注意SWitCh语句,当某一个CaSe满足时的执行结果,注意有无break的区别8.自增、自减操作,注意表达式和变量的取值的差别9.注意for循环和while循环语句块内break或continue对程序执行的影响10.函数这一章,一定要注意函数的定义和声明的不同。
另外注意函数的实参传递给形参时,如果传递的是变量的值,则在函数体内形参的值发生变化,是不会影响到实参的值的。
但如果传递的是变量的地址,则形参的值改变后,实参的值是会改变的。
注意PPT及课本中的那个交换两个变量的值的swap函数11.注意定义数组时,数组的大小只能用常数;在引用数组的某一个元素的值时,数组的下标是从0开始的,且下标最大只能为数组大小减一12.字符串的末尾会补\013.自己动手编写PPT上讲到的几个字符串处理函数14.冒泡排序、选择排序,需要理解这两个函数并能自己动手编写15.结构体、共用体的成员在内存中的存放。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1:排序函数不需要返回值/*=====================================本函数用于对数组从小到大排序参数说明:a[]表示待排序数组的首地址;num表示数组长度i,j是循环变量;k用于记录每轮比较的最小值下标;temp是交换临时变量返回值:无=====================================*/void sort(int a[],int num){int i,j,k,temp;for(i=0;i<num;i++) //选择法排序{k=i;for(j=i+1;j<num;j++){if(a[j]<a[k])k=j;}temp=a[i];a[i]=a[k];a[k]=temp;}}错误int queue(int array2[n]) //定义为数组排序的函数{int i,j,temp;for(i=0;i<=n-2;i++) //选择法排序for(j=i+1;j<=n-1;j++){if(array2[i]>array2[j]) //交换数组的值{temp=array2[i];array2[i]=array2[j];array2[j]=temp;}}}return(array2[n]);//此返回值的意义是什么?为什么程序运行成功?【此返回值其实已经溢出了,通过调试函数可以看出】/*===========================================本函数用于将数组中的元素值作为ACSII码生成字符串,并对应存储输入的字符数组中。
参数说明:a[]数组作为ACSII码;num表示数组长度;str[]用于储存形成的字符串;返回值:无============================================*/此时不需要返回值所以不需要定义函数的类型,为空即可;void ACSIIstr(int a[],int num,char str[]){int i;for(i=0;i<num;i++){str[i]=a[i];}}The variable 'num' is being used without being initialized. 到底是毛意思啊int panduan(char str1[],char str2[]){int i=0,j=0,k=0,len1,len2,num=0;{如果这里写成num,就会出现:还有一种情况则是未加&The variable 'num' is being used without being initialized. }while(j>=0){if(str1[j]==0)break;如果此处写成str1[j]==’0’,那么此处的循环成为死循环。
j++;}len1=j;while(k>=0){if(str2[k]==0)break;k++;}len2=k;for(i=0;i<=len2-1;i++){if(str2[i]==str1[0]){num=0;for(j=0,k=i;k<=len2-1,j<=len1-1;j++,k++){if(str2[k]==str1[j]/*||str1[i]==str2[j]+32||str1[i]==str2[j]-32*/){num++;}else break;}}if(num==len1)return 1;}return 0;}#include<stdio.h>#define n 30void main(){int numb=0,array2[n]={1,1,1,1,1},len1=0,i=0;int tran2(int num,int array1[n],int len);printf("请?输?入?一?个?十?进?制?正y整?数簓:阰\n");scanf("%d",&numb);len1=tran2(numb,array2,len1);printf("len1=%d\n",len1);for(i=0;i<=len1-1;i++){//if(array2[i]!=0)printf("%d",array2[i]);}printf("\n");}int tran2(int num,int array1[n],int len){int i=0,j,shan,temp;while(num){printf(" %d\n",num%2);shan=num/2;if(num%2){array1[i]=1;}else{array1[i]=0;}printf(" %d\n",array1[i]);i++;printf(" %d\n",i);num=shan;}for(j=0;j<=i-1;j++){temp=array1[j];array1[j]=array1[i-1-j];该方法错误,其实在j=2的时候交换已经全部完成,再array1[i-1-j]=temp; 继续下去就又交换了一遍printf("%d",array1[j]);}for(j=0;j<=(i-1)/2;j++){temp=array1[j];array1[j]=array1[i-1-j];array1[i-1-j]=temp;}len=i;return(len);}1:Numb is corrupt 的原因是数组定义为array【】=0;2:函数未返回值的时候len1=0,为什么?明明函数里面的len值已经改变了;3:如果函数想要返回两个值应该怎么办?E59#include<stdio.h>#include<math.h>#define n 100void sushu(int *p,int m);int main(){int arr[n]={0},*pl,i;pl=arr;sushu(pl,n);for(i=0;i<=n-1;i++){printf("%5d",*pl++);if(i%10==9)printf("\n");}}void sushu(int *p,int m){int k,i,j,num;for(i=2,num=0;num<m;i++){k=sqrt(i*1.0);for(j=2;j<=k;j++){if(i%j==0)break;}if(j<=k)continue;else{*p++=i;num++;}}}如果num《=m,则显示“arr”is corrupt。
原因依然是数组的越界。
void sort(int *p,int m) //定¨义?排?序ò函ˉ数簓,?两?个?参?数簓,?数簓组哩?首骸?地?址·及°有瓺效§元a素?的?个?数簓{int i,j,temp;for(i=0;i<=m-2;i++)for(j=i+1;j<=m-1;j++)总是把j写成j=0;导致出错{if(p[i]>p[j]){temp=p[i];p[i]=p[j];p[j]=temp;}}}void sscanf(int *p,int m) //定¨义?排?序ò函ˉ数簓,?两?个?参?数簓,?数簓组哩?首骸?地?址·及°有瓺效§元a素?的?个?数簓{int i;printf("请?输?入?数簓组哩?的?元a素?:阰\n");for(i=0;i<m;i++){scanf("%d",p++);这种输入不能输逗号的,只能用空格或者enter}#include<stdio.h>int trans(char *p,int max); //对?函ˉ数簓的?声Θ?明÷int trans2(char *p,int min);int main(){char arr[4]={0},*pl;int i,ma=0,mi=0;printf("请?输?入?少Θ??个?数簓字?符?:阰\n"); //输?入?数簓字?符?for(i=0;i<=3;i++){arr[i]=getchar();arr[i]-=48;if(arr[i]==-38)此种赋值挺重要的,为什么?=-38{arr[i]=0;}}pl=arr;ma=trans(pl,ma);mi=trans2(pl,mi);printf("max=%d\nmin=%d\n",ma,mi);}int trans(char *p,int max){int temp,i,j;for(i=0;i<=2;i++)for(j=i+1;j<=3;j++){if(p[i]>p[j]){temp=p[i];p[i]=p[j];p[j]=temp;}}if(p[2]==0){max=p[3];}else if(p[1]==0){max=p[2]+p[3]*10;}else if(p[0]==0){max=p[1]+p[2]*10+p[3]*100;}elsemax=p[0]+p[1]*10+p[2]*100+p[3]*1000;return(max);}int trans2(char *p,int min){int temp,i,j;for(i=0;i<=2;i++)for(j=i+1;j<=3;j++){if(p[i]>p[j]){temp=p[i];p[i]=p[j];p[j]=temp;}}min=p[3]+p[2]*10+p[1]*100+p[0]*1000;return(min);}E64 12.27不能将参数1从“char*”转换为“int*”,是什么意思?题目中调用函数时是 char dele(char *P,int m),但是函数声明却将其写成了 char dele(int *P,int m);运算符“==”不起任何作用,是否是有意的,通常情况下是将“=”打错了。
Is being used without being intialized;既未被初始化的变量;可能是等号两边的顺序搞错或未将指针赋值;输完字符串后windows显示要关闭系统,错误原因是指针指到了不该指的地方;p1=p2=p;p2+=m-1;第一次将m-1写成了m,导致溢出;使用scanf(“%S“,str);如果中间输入了空格的话,之后的字符便不能输入。