专升本考试C语言错题整理

前言:以下错题都是小编专升本考试中所遇到的常见的错题,希望对大家有所帮助,如有不足之处,还希望大家帮忙指出!

题型一:不同数据类型之间的混合运算

Python已知ABC都是1位整数 abccba和为1333 已知abc为整数,ab+c=49_#include


例:

#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 };