前言:以下错题都是小编专升本考试中所遇到的常见的错题,希望对大家有所帮助,如有不足之处,还希望大家帮忙指出!
题型一:不同数据类型之间的混合运算
例:
#includeint main() { char a = 'a'; int b = 2; double c = 1.0; printf("%d, %lfn", a + b, b + c); return 0; }
运行结果是:99, 3.000000
解析:字符’a’的ASCII码是97,和int类型的b相加等价于97 + 2 = 99;b向double类型靠齐,等于于2.000000 + 1.0 = 3.000000
注意:需要记住的几个常用的ASCII码:0~ 9的ASCII码为48~ 57;A~ Z的ASCII码为65~ 90;a~ z的ASCII码为97~122。切记!切记!
例1:
#incldueint main() { int x = 1, a = 0, b = 0; switch(x){ case 0: b++; //此处判断x的值不为0,所以不执行b++,然后跳到下一个判断 case 1: a++; //此处判断x=1为真,执行a++,但是由于没有break,会继续往下执行 case 2: a++;b++; //此处继续执行a++,b++然后终止程序 } printf(“a=%d,b=%dn”, a, b); return 0; }
运行结果是:a=2,b=1
注意:switch里面的判断条件结束后如果没有遇到break,程序并不会停止,而是继续往下执行。
例2:
#incldueint main() { int a = 15, b = 21, m = 0; switch(a % 3) { case 0:m++;break;//a%3的值为0,此时判断为真,m++,然后遇break退出,后面不管 case 1:m++; switch(b % 2) { default:m++; case 0:m++;break; } } printf(“%dn”,m); return 0; }
运行结果是:1
题型三:continue的灵活运用例1:
#incldueint main() { int a = 1, b; for(b = 1; b <= 10; b++) { if(a >= 8) break; if(a % 2 == 1){a += 5;continue;} a -= 3; } printf("%dn",b); return 0; }
运行结果是:4
解析:continue是跳出当前循环执行下一个循环。
第一次循环:b=1,1%2= =1为真,a=1+5=6之后continue执行上面循环;第二次循环:b=2,a=6-3=3;第三次循环:b=3,3%2==1为真,a=3+5=8之后continue执行上面循环;第四次循环:b=4,8>=8为真,此处break循环终止,所以最后输出b为4。
例2:
#includeint main() { char s[4] = {'1', '2', '1', ' '}; int k = 0, a = 0, b = 0; do { k++; if (k % 2 == 0) { a = a + s[k] - ' ';//' '的ASCII码是0 continue; } b = b + s[k] - ' '; a = a + s[k] - ' '; }while(s[k + 1]); printf("k=%d a=%d b=%d", k, a, b); return 0; }
运行结果是:k=2 a=99 b=50
解析:第一次循环,k=1,判断1%2==0为假,b=0+‘2’-‘ ’=50;a=0+‘2’-‘ ’=50;判断s[1+1]=s[2]=‘1’为真;第二次循环,k=2,判断2%2= =0为真,a=50+‘1’-’ ’=99;continue跳出循环去判断s[2+1]=s[3]=' ’为假,循环结束 。
关于这个函数的形参和实参,小编简单总结了一下,能通过形参改变实参的值,大多数情况下只有数组和指针可以,其它的包括什么结构体啥的都不行。
关于这部分的理论不多说,咱直接看题。
例1:
#includevoid swap_1(int *x,int *y) { int *t; t = x; x = y; y = t; printf("%d %dn", *x, *y); } void swap_2(int *x, int *y) { int tmp = *x; *x = *y; *y = tmp; } main() { int x = 3,y = 5; swap_1(&x, &y); printf("%d %dn", x, y); swap_2(&x, &y); printf("%d %d ", x, y); return 0; }
运行结果:3 5 5 3
解析:相信大家看到swap_1和swap_2这两个函数都蒙圈了吧,不要害怕,咱们慢慢分析。前一个是值交换,并没有影响实参的改变,虽然形参改变了,但是函数调用完了之后栈空间就释放了;后者是地址交换,形参是指针类型,间接控制内存实参所指向的内存单元数据的交换。
例2:
#includetypedef struct { int b, p; }a; void f(a c) //注意:c是结构变量名 { int j; c.b += 1; c.p += 2; }//通过形参改变结构体变量的值,实参的值不会改变 int main() { int i; a a = {1, 2}; f(a); printf("%d, %d", a.b, a.p); return 0; }
运行结果:1, 2
函数的形参和实参的特点:
①形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分的内存单元。因此,形参只有在函数内部有效。函数的形参和实参分别占用不同的存储单元。②实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传给形参。③实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。④函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值传送给实参。因此在函数的调用过程中,形参的值发生改变,而实参中的值不会改变。切记!切记!
易错点一:初始化之后不能整体赋值
#includeint main() { int a[5] = {1, 2, 3, 4, 5}; return 0; }
易错点二:数组赋初始值的时候,可以不指定维度,但是一定要指定长度,维度=初值个数/长度+1 例:int a[][2] = {1,2,3,4,5};则维度为5/2+1=3(维)
#includeint main() { int a[][2] = {1, 2, 3, 4, 5}; return 0; }
易错点三:数组的部分没给初始值的成员的值不一定就是0
#includeint main() { int a[][4] = {0, 0};//2/4+1=1维,这里只是给了a[0][0]和a[0][1]的初始值,a[0][2]和a[0][3]是未知的 int b[2][2] = { 0 };//这里是把所有的数组成员的初始值全部初始化为0 return 0; }
注意:只有整体赋值为{0}的时候所有元素的初始值才为0,例:int a[2][2] = { 0 };
小编暂时先写这么点儿,如果大家喜欢的话,小编还会持续更新~
都看到最后了,还不给小编点个赞吗?嘿嘿!



