专升本考试C语言错题整理
前言:以下错题都是小编专升本考试中所遇到的常见的错题,希望对大家有所帮助,如有不足之处,还希望大家帮忙指出!
题型一:不同数据类型之间的混合运算
例:
#include <stdio.h>
int main()
{
char a = 'a';
int b = 2;
double c = 1.0;
printf("%d, %lf\n", 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。切记!切记!
题型二:switch和break的灵活运用
例1:
#incldue <stdio.h>
int 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=%d\n”, a, b);
return 0;
}
运行结果是:a=2,b=1
注意:switch里面的判断条件结束后如果没有遇到break,程序并不会停止,而是继续往下执行。
例2:
#incldue <stdio.h>
int 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(“%d\n”,m);
return 0;
}
运行结果是:1
题型三:continue的灵活运用
例1:
#incldue <stdio.h>
int 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("%d\n",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:
#include <stdio.h>
int main()
{
char s[4] = {'1', '2', '1', '\0'};
int k = 0, a = 0, b = 0;
do
{
k++;
if (k % 2 == 0)
{
a = a + s[k] - '\0';//'\0'的ASCII码是0
continue;
}
b = b + s[k] - '\0';
a = a + s[k] - '\0';
}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’-‘\0’=50;a=0+‘2’-‘\0’=50;判断s[1+1]=s[2]=‘1’为真;第二次循环,k=2,判断2%2= =0为真,a=50+‘1’-’\0’=99;continue跳出循环去判断s[2+1]=s[3]='\0’为假,循环结束 。
题型四:函数的形参与实参
关于这个函数的形参和实参,小编简单总结了一下,能通过形参改变实参的值,大多数情况下只有数组和指针可以,其它的包括什么结构体啥的都不行。
关于这部分的理论不多说,咱直接看题。
例1:
#include <stdio.h>
void swap_1(int *x,int *y) {
int *t;
t = x;
x = y;
y = t;
printf("%d %d\n", *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 %d\n", x, y);
swap_2(&x, &y);
printf("%d %d ", x, y);
return 0;
}
运行结果:3 5 5 3
解析:相信大家看到swap_1和swap_2这两个函数都蒙圈了吧,不要害怕,咱们慢慢分析。前一个是值交换,并没有影响实参的改变,虽然形参改变了,但是函数调用完了之后栈空间就释放了;后者是地址交换,形参是指针类型,间接控制内存实参所指向的内存单元数据的交换。
例2:
#include <stdio.h>
typedef 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
函数的形参和实参的特点:
①形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分的内存单元。因此,形参只有在函数内部有效。函数的形参和实参分别占用不同的存储单元。②实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传给形参。③实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。④函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值传送给实参。因此在函数的调用过程中,形参的值发生改变,而实参中的值不会改变。切记!切记!
题型五:数组的初始化和维度的判别
易错点一:初始化之后不能整体赋值
#include <stdio.h>
int main()
{
/*错误代码:
int a[5];
a[5] = {1, 2, 3, 4, 5};
*/
int a[5] = {1, 2, 3, 4, 5};
return 0;
}
易错点二:数组赋初始值的时候,可以不指定维度,但是一定要指定长度,维度=初值个数/长度+1 例:int a[][2] = {1,2,3,4,5};则维度为5/2+1=3(维)
#include <stdio.h>
int main()
{
/*错误代码:
int a[3][] = {1, 2, 3, 4, 5};
*/
int a[][2] = {1, 2, 3, 4, 5};
return 0;
}
易错点三:数组的部分没给初始值的成员的值不一定就是0
#include <stdio.h>
int 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 };