C语言错误与难点总结

我是灼灼,一只初学Java的大一金渐层。
向往余秀华和狄兰·托马斯的疯狂,时常沉溺于将情感以诗相寄;追逐过王尔德、王小波的文字,后陷于毛姆和斯蒂芬·金不可自拔;热爱文学的浪潮,白日梦到底却总在现实里清醒;艳羡平静又极度渴盼奔跑的力量。
欢迎与我交流鸭· QQ:1517526827;
个人博客:https://blog.csdn.net/weixin_52777510?spm=1001.2101.3001.5343

C语言笔试题目错误点和难点总结


C语言笔试考试考前准备中…

(一只小可怜猫咪的挣扎史,誓要翻身做主人!)
(要凉了呜呜呜…)

一,C语言中的语句可分为:

1 )表达式语句; 2 )函数调用语句; 3 ) 控制语句;4 ) 复合语句;5 )空语句。

详细解释(来自百度):

  1. 表达式语句

表达式语句由表达式加上分号“;”组成。
其一般形式为: 表达式;

执行表达式语句就是计算表达式的值,例如 c=a+a;

  1. 函数调用语句

由函数名、实际参数加上分号“;”组成,其一般形式为:

函数名(实际参数表);

例如 printf("Hello !");

  1. 控制语句

控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句。 可分成以下三类:

条件判断语句:if语句、switch语句;

循环执行语句:do while语句、while语句、for语句;

转向语句:break语句、goto语句、continue语句、return语句。

  1. 复合语句

把多个语句用花括号{}括起来组成的一个语句称复合语句。

在程序中应把复合语句看成是单条语句,而不是多条语句
例如:
{ x=y+z; a=b+c; printf("%d%d", x, a); } //这是一条语句;

  1. 空语句

只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体
例如:while( getchar()!='\n' );

二,打开文件的函数:

使用 <stdio.h> 头文件中的 fopen() 函数即可打开文件,它的用法为:

FILE *fopen(char *filename, char *mode);

filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。

详细内容来自csdn

三,C语言中不允许使用goto语句?

不是不允许,是不提倡,最好不用;

goto使用注意(来自csdn):

不加限制地使用goto:破坏了清晰的程序结构,使程序的可读性变差,甚至成为不可维护的"面条代码"。经常带来错误或隐患,比如它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句。

关于使用goto语句的原则

(1)使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。
(2)使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。
(3)不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。
(4)应该避免向两个方向跳转。这样最容易导致"面条代码"。

好像不知道什么是面条式代码???我在这里

四,函数若无返回值,则它一定无形参?

说法错误;

一个函数可以有参数,没有返回值;
可以没有参数,有返回值;
可以没参数,没返回值;
可以有参数,有返回值;
参数和返回值没有必然联系
五,原码,补码,反码,EBCDIC码,BCD码?

源码补码反码基础概念及计算方法

EBCDIC码百科

BCD码百科

六,取模运算,双目运算符%

两个参与运算的常量必须是整型

七,!、&&、||运算符优先级和运算范围

逻辑非!高于逻辑与&&高于逻辑或||;

八,数据a和b交换的方法
1,利用中间变量temp作为临时变量交换数值,这是变量交换最简单最通用的方法;

其对数据类型没有特殊要求,八种基本类型byte, short, int, long, float, double, char, boolean都可以。

2,可以用两个数求和然后相减的方式进行数据交换。
int a,b;
a=a+b;
b=a-b;
a=a-b;

这个算法的弊端在于如果 a 和 b 的数值过大的话,超出 int 的值就会损失精度

对于浮点型float和double,会因IEEE 754产生精度的问题;

对于boolean类型,加减号没定义所以也是不能用的;

更多知识关于交换两个变量的值的办法

九,运算符优先级!!!

图表后补

十,24题

题目源代码及题目解析为注释:

# include <stdio.h>
int main()
{
	int a=5,b=4,c=3,d=2;
	if(a>b>c)		//真则执行,a>b为真,值等于一;1>c为假,不执行 
	{
		printf("%d\n",d);	//不会输出2 
	}
	else if((c-1>=d)==1)	//2>=2成立,为真,值为1,1==1成立,所以执行这条语句 
	{
		printf("%d\n",d+1);	//输出3 
	}
	else
	{
		printf("%d\n",d+2);	//不会执行了! 
	}
	return 0;
} 

结果为3

解决~

十一,25题

题目要求及源代码:

# include<stdio.h>
//输入时按照3 4的格式来输入两个整数。 
//题目相关注意:
//在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。
//C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
//在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
int main()
{
	int a,b,s;
	scanf("%d %d",&a,&b);	//输入3 4,实际读入为3和4的值,并没有读入空格的值32!scanf("%d%d",&a,&b)输入的两个数据用空格,TAB或者回车区分开
	s=a;	//a=3,赋值给s,则s=3 
	if(a<b)	//a=3.b=4,成立,执行这条语句 
	{
		s=b;	//b=4,赋值给s,则s=4 
	}	
	s*=s;	//执行该条语句:s=s*s,则s的值为4的平方 
	printf("%d\n",s);	//输出为16 
	return 0;
} 

运行结果:

3 4
16
十二,注意switch、case语句如果case后面没有分号的话,则进入该指定case语句之后不退出,后面所有的case和default语句全部执行;
十三,注意循环语句中的输出语句,观察占位符后面有没有"\n"换行符,没有则多次输出都会挨着输出,不会换行;
十四,do-while语句至少执行一次,当while();语句括号内的值为0时退出循环,否则再次执行do语句;
十五,continue和break的区别

continue语句执行后会完全跳出本次循环,跳过continue后面的未执行的语句;break不会;

关于break和continue详细区别和好处

十六,37题

关于整型数组的定义:

报错:

[Error] cannot convert ‘’ to ‘int’ in assignment

解释:

数组定义与初始化分开时,只能进行单个元素的赋值,而不能进行统一赋值。

当定义好数组再进行单个元素赋值时,输出的数据很有问题…

举例如下:

#include <stdio.h>
int main()
{
	int a[3];
	a[0]=9;
	a[1]=2;
	a[2]=3;
	for(int i=0;i<3;i++)
	{
		printf("%d\n",a[3]);
	}
	return 0;
} 

运行结果:

0
1
2

不懂他怎么了,输什么都会这样。

这种整型数组定义方法也非常奇怪!

#include <stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	int a[n]={1,8,7};
	for(int i=0;i<n;i++)
	{
		printf("%d\n",a[n]);
	 } 
	return 0;
} 

输出:

3
0
0
0

或者:

8
10699952
10699952
10699952
10699952
10699952
10699952
10699952
10699952

正确的一种定义方法:

# define SIZE 10
int a[SIZE];
十七,EOF?

关于C语言中EOF的理解

EOF是什么?

十八,C语言中函数的组成部分包括函数头函数体
十九,模块化程序设计的原则是()和();

有关详细介绍

书上暂时没找着…

二十,在c程序中,函数可能嵌套定义,也可以嵌套调用(F);

//不能嵌套定义,但可以嵌套调用

C语言函数嵌套定义问题

C语言函数嵌套调用、递归调用

二十一,&&和||运算都是双目运算,但是他们的优先级不同?

与运算符的优先级高于或运算符,非和异或高于他们两个;

二十二,一个算法具有包括“零个或多个输出”在内的5个特性(F);

//应该是输入;输出至少要有一个的;

算法的五大特性

1.输入:在算法中可以有零个或者多个输入

2.输出:在算法中至少有一个或者多个输出

3.有穷行:在执行有限的步骤之后,自动结束不会出现无限循环并且每一个步骤在

可接受的时间内完成

4.确定性:算法的每一个步骤都具有确定的含义,不会出现二义性

5.可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限

的次数完成

二十三, .dat文件是什么?

dat文件的类型和打开方式

看不懂的东西…

二十四,+=和*=运算符优先级?

优先级相同,结合性自右向左
(整个运算式都是自右向左结合计算)

二十五,C语言中的局部变量的隐含存储类别是?

auto?暂不清楚

局部变量和全局变量的介绍

二十六,定义一维数组必须初始化嘛?

这个可能是必须的。

书上是这么写的:

一维数组的初始化也是在定义的一维数组时直接给其成员赋初值。否则数组中各成员的值将是随机的,不可预料的。

二十七,枚举定义的值?15题

报错:

[Error] expected primary-expression before ‘enum’

如果枚举没有初始化, 即省掉"=整型常数", 则从第一个标识符开始,  顺 
次赋给标识符0, 1, 2, ...。
但当枚举中的某个成员赋值后, 其后的成员按依次加1的规则确定其值。 

15题源代码:

int area1;
enum area{taiyuan=3,beijing,xian=0,tianjing,shanghai}aera1;
printf("%d\n",shanghai);

所以按照要求,beijing=0,tianjing=1,shanghai=2.

输出结果:

2
二十八,数组名作为实参传递给形参时,形参数组名被处理为?

数组第一个元素的首地址

二十九,宏是一种特殊的函数?

正确!

三十,存放变量地址的变量是?

//指针变量

三十一,34题

呃,还是弄不懂这道题…

34题源代码:

# include<stdio.h>
//都是整型数组,里面包含四个元素,定义方法不同
int main()
{
	int *p1[4];	//这是最常见的一种指针数组定义方法,输出的数组名必然代表数组首元素的地址,p1是一个指针数组, 每一个数组元素指向一个int型数据.
	printf("%d\n",p1);
	int (*p2)[4];	//p2是一个指针, 指向一个int[4]的数组,存储的是地址的地址
	printf("%d\n",p2);
	int **p3;	//地址的地址,一个*也是0
	printf("%d\n",p3);
	return 0;
}

我们输出一下看看结果先!

6487536	//代表首元素的地址
1
0

int *p1[4][]的优先级别高,所以它首先是个大小为4的数组,即p1[4];剩下的int *作为补充说明,即说明该数组的每一个元素为指向一个整型类型的指针。

int (*p2)[4], 它首先是个指针,即*p2,剩下的int [4]作为补充说明,即说明指针p2指向一个长度为4的数组。

三十二,指针变量的赋值

一个例子:

通过指针变量访问整型变量

#include <stdio.h>
int main(){
    int a=100,b=10;
    int *pointer_1,*pointer_2;
    pointer_1=&a;
    pointer_2=&b;
    printf("a=%d,b=%d\n",a,b);
    printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2); 
    return 0;
}
a=100,b=10
*pointer_1=100,*pointer_2=10
三十三,异或运算?

同则为零,异则为一;

与、或、异或运算

三十四,与和与运算区别?

&和&&?

三十五,二维数组元素的地址怎么引用?

地址介绍

三十六,’\0’和NULL?

二者的区别


暂时更新如上,持续复习中,短期更新,考前必更完~

在这里插入图片描述
如果对你有帮助的话不要忘记一键三连噢~
谢谢鸭~

初次编写于2021/2/15日;
更新于2021/3/5日。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值