本文章是根据我自己期末复习以及题库为大家总结的C语言知识点马虎错误:
1,若定义变量的语句有错误,常见考点有两个:
(1)变量的类型(是int型还是double型,在定义前要想好。以及定义函数时定义的函数类型与返回值的类型要一致,虽然不一致时系统会自动转换,但是我们还是保持一致的好)
(2)在定义用于存放运算结果的变量时,一定要赋初值。一般赋值0以及循环for语句的初值i等等。
2,若scanf语句有错误,常见考点有两个:
(1)格式声明符号要与后面欲赋值的变量的类型一致
例如:double定义后,函数scanf要用%lf输入,否则会有问题,比如结果为0,而输出时用%f或者%lf都可以。相同的float定义的函数则用%f,%lf都可以输出。
(2)变量的前面要有地址符号&
3,若printf语句有错误,常见考点有1个:
格式声明符号要与后面欲输出的变量的类型一致
4,return语句后面可以返回0、常量、变量和表达式的值。小括号也可打可不打
5,数组定义的一般形式(int a[n]),详见p143, 其中的常量表达式不能为变量
6,for语句的格式,三个表达式之间用分号,且分号不可省略,记得不要用逗号,for里面的三个语句的变量一般一致,如果不一致,则判断是有意为之还是输入错误(例如for(i=0;i<10;j++)这里最后明显是i)
以及for语句的括号外打花括号而不是打分号
7,break与continue:
break:是结束本循环(仅仅跳出一层循环),或者结束switch-case语句
continue:是结束本次循环(例如for循环,就是跳过本次的语句2的内容,直接进行语句3)
在改错题中若错误出现在break语句,则通常是将break换为continue;反之,若错误出现在continue,通常是将其换为break
8,C语言中乘号不能省略,且用*表示乘法运算(c=a*b而不是c=ab,这个特别是在调用
9,if : if (n&3=0)
// = 是赋值符号,用于将右边的值赋给左边的变量;
// == 是关系符号,用来判断两个值是否相等 。
改错中if后面表达式中的赋值符号是常见的考点。
10,函数:Sun(a,b)调用带有返回值的函数,应将函数的返回值保存在变量里,而且这个变量应该提前赋初值:
改为:f=0;
f= fun(a,b);
11,语句结尾的“;”为英文格式
12,if语句编译的程序大于一行时,要使用大括号括起来。即复合语句。如果没有花括号但是又有多行代码,那么判断/循环语句只负责紧跟着的那一代码
13,在你的%5.2e中,“5”代表最小输出宽度为5,即实际位数多于5时,则按实际位数输出,若实际位数少于定义的宽度5时,则补以空格或0。其中的“.2"代表精度为2,即小数位数为2,若实际位数大于2,则截去多余的部分。(目的是为了对齐,以及规范数据的小数点位数)
14,在写代码时容易一气呵成而错误把printf等写到for语句中,记得按需求判断是否需要换行。按Vscode里面输入代码的规范,for,if等范围语句写完以后打{},但是要记得什么时候出括号,
15,c语言乘法的乘号计算的时候不可以省略,比如说a乘以b。应该写成a*b
(而不是ab)
16,if(a=5)是允许的,先执行赋值语句,然后将赋值语句的最后结果作为判断条件。
例如:If(a=0)执行的就是else语句了
17,函数的实参传递到形参有两种方式,值传递和地址传递
18,关于运算符,表达式,语句:运算对象加运算符构成表达式,表达式加分号构成表达式语句
19,结合顺序:大多数为从左到右,而从右到左的有3个:单目运算符(例如,自加自减),条件运算符,和赋值运算符
20,scanf输入多个数据的时候,分隔符可以是空格,制表符,回车符,但不包括逗号。除非scanf(表达式1,表达式2)中的表达式1里面的两个数据是用逗号隔开的。
21,c语言用非0(!0)表示逻辑真,用0表示逻辑假。
22,关系运算符有6个,<,>,<=,>=,==,!=,前面的4种优先级大于后面两种
23,c语言中不支持连续不等式,例如:a>b>c。都是>,优先级相同,从左到右先判断a>b,返回1或者0。随后判断1>c或者0>c。最后返回结果1或0。
要作为判断条件表达a>b>c为(a>b)&&(b>c)。
24,for(表达式1;表达式2;表达式3)循环中有continue时,是提前结束本次循环,即在本次continue后面的语句就不运行了。但是for语句中的表达式3并不跳过
25,函数在定义时数组一定要有数组名,而在声明函数地时候数组名可以省略。
定义: void sort(int *x,int n) 声明:void sort(int [],int );
26,如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数声明,如果背调用的函数出现在主函数之前可以不必声明。
27,在所有函数定义之前,在函数的外部已经做了声明,那么在各个主调函数中不必重复声明。
28,指针在使用之前必须要初始化,把一个具体的地址付给他,否者会报错,因为此时指针可能指向一个重要储存空间。如果不指向任何数据就赋“空值”NULL
29,&是取地址符,*是乘号也是间接访问运算符,他们是互逆的两个运算符,在指针变量名前加间接访问运算符就等价于他所指向的量。
30,二维数组虽然是空间的,但是实际在储存时还是线性储存的,即先储存第一行,随后第二行,都是从左往右。和初始化的展现形式一样a[2][3]={1,2,3,4,5,6}数字4的表达方式 *(a[0]+3)或者*a[1]
31,不能将一个字符串赋给一个数组名,除非初始化的时候。这一点和指针不一样,虽然他们都是地址但是,数组的地址为一个常量,所以不能给常量赋值。
32,同样的,指针是一个地址,不能将一个常数赋给指针,这样是非法的。
33,字符串的输入:用scanf(“%s”,str)
注意点:1,输入参数:字符数组名,不加地址符
2,遇到回车,空格输入结束,并将输入的字符串以及‘\0’送到数组中
用gets(str)
注意点:1,遇到回车输入结束,并将输入的字符串以及‘\0’送到数组中
34,字符串的输出:
用printf(“%s”,str)或者printf(“%s”,“hello”)
用puts(str)或者puts(“hello”)
puts:输出字符串后自动换行,输出的参数可以是数组名或者是字符串常量,遇到‘\0’结束.
35,在执行函数调用时,实参把值计算出来,拷贝(形参的改变不影响实参变量的值)给相应位置(形参与实参个数相同,类型一致)的形参;函数执行完后,通过return(),可以返回一个结果值(只能返回一个结果,类型与函数定义时一致)。
36,局部变量:
在函数内定义的变量(包括形参)
作用范围: 本函数内部
定义在复合语句内的变量
作用范围: 复合语句内部
37,全局变量:
在函数以外定义的变量,不从属于任一函数。
作用范围:从定义出到源文件结束(包括各种函数)
38,主函数和其他函数之间不可相互调用
38,else与最靠近他的,没有与别的else匹配过的if匹配
39,switch(expression)
case(constant-expression)
里面的constant-expression与expression必须要用整数。‘I’和‘V’在编译时会将字符值转化为int型的值,而如果用“I”与“V”时,为字符串,字符串最少是2位,最后一个为‘\0’,而字符串无法转化为int型的值,所以字符串自然不行。
40,从39里面知道还是要重视基础,“a”与‘a’前者是字符串,后者是字符。
简单的来说就是,通常情况下单个字符用字符,多个字符组合起来就是字符串了
41,巧妙利用求余与除法来求一个三位数的百位,十位,个位。
例如这个三位数为sum
那么百位:hd=sum/100;
那么十位:td=num/10%10;
那么个位:sd=num%10;
42:c语言中的逗号表达式:
多个表达式可以用逗号分隔开,其中逗号分开的表达式的值分别计算,整个表达式的值是最后一个表达式的值:例如
Int i,j;
i = (10-2, 3*4);//加括号的原因是逗号的计算优先级最低
j = 10-2, 3*4;
//最后结果,i=12而j=8
43,接着补充一个自增与逗号表达式结合的笔试题
main()
int x,y,z;
x=y=1;
z=x++,y++,++y;
printf(“%d,%d,%d”,x,y,z);
由于赋值运算符优先与逗号表达式
所以实际上是这样的:
(z=x++),y++,++y;
答案为:2,3,1
44,for语句循环中,语句二没有限定范围时:
For(i=5 ;i; i--)
For(j=0; j<4; j++);{,,,}
第一句话语句二实际上是表示:i>0
所以第一个for是循环5次,第二个for是循环4次。故一共4*5=20次
45,在c语言浮点数编程常见的错误输出。
#INF:这个值表示“无穷大(infinity的缩写)”,即超出了计算机可以表示的浮点数的最大范围(或者说是超过了float或者double的最大值)
例如:
当用0除以一个整数时便会得到一个
1,#INF/inf值
当用0除以一个负整数时便会得到一个
2,#INF/-inf值
解决方法:
观察程序中的/号,观察是否有除0的,或者除数的表达式为0,以及计算顺序等问题使得除数为0的情况。行办法将0去除即可
46,数组中的鞍点指的是行最大,列最小的数字。鞍点可能不止一个,也可能没有,例如下列数组:133/255/789中
第一行的2个3就是鞍点。
一般是用的一个for循环求行最大,一个for循环求列最小。
47,在计算最大公倍数的时候,有几种算法要了解一下:
辗转相除法:
用除数和余数反复做除法运算,当余数为0时,取当前算式的除数为最大公倍数
例如:1997与615
1997/615=3(余数为3)
615/152=4(余数为7)
152/7=21(余数为5)
7/5=1(余数为2)
5/2=2(余数为1)
2/1=2(余数为0)
所以1997与615的最大公约数为1
更相减损法:
用减数和差反复做减法运算,当减数和差相等时,此数为最大公约数:
例如:98与63
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以得,98与63的最大公约数为7
48,char str [] = “hello”
char str [] = {‘h’,‘e’,‘l’,‘l’,‘o’}
问这两种定义的数组长度是否相同,答案是不相同的
基本上定义并初始化数组有以下几种方式:
char str [] = “hello”
(在数组末尾自动添加‘\0’)
char str [] = {‘h’,‘e’,‘l’,‘l’,‘o’}
(在数组末尾不会自动添加‘\0’)
char str [10] = “hello”
(当赋值数组数小于数组长度时,系统都会自动为其添加上‘\0’,在这里后面的5个位置都是‘\0’)
char str [5] = {‘h’,‘e’,‘l’,‘l’,‘o’}
(此时在数组末尾不会自动添加‘\0’)
char str [10] = {‘h’,‘e’,‘l’,‘l’,‘o’}
(此时由于数组长度大于字符串长度,在数组末尾会自动添加‘\0’)
最后,我是小白一个,有什么不足的地方还请各位大佬指出。