我是灼灼,一只初学Java的大一金渐层。
向往余秀华和狄兰·托马斯的疯狂,时常沉溺于将情感以诗相寄;追逐过王尔德、王小波的文字,后陷于毛姆和斯蒂芬·金不可自拔;热爱文学的浪潮,白日梦到底却总在现实里清醒;艳羡平静又极度渴盼奔跑的力量。
欢迎与我交流鸭· QQ:1517526827;
个人博客:https://blog.csdn.net/weixin_52777510?spm=1001.2101.3001.5343
C语言笔试题目错误点和难点总结
C语言笔试考试考前准备中…
(一只小可怜猫咪的挣扎史,誓要翻身做主人!)
(要凉了呜呜呜…)
一,C语言中的语句可分为:
1 )表达式语句; 2 )函数调用语句; 3 ) 控制语句;4 ) 复合语句;5 )空语句。
详细解释(来自百度):
- 表达式语句
表达式语句由表达式加上分号“;”组成。
其一般形式为:表达式;
执行表达式语句就是计算表达式的值,例如
c=a+a;
- 函数调用语句
由函数名、实际参数加上分号“;”组成,其一般形式为:
函数名(实际参数表);
例如
printf("Hello !");
- 控制语句
控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句。 可分成以下三类:
条件判断语句:if语句、switch语句;
循环执行语句:do while语句、while语句、for语句;
转向语句:break语句、goto语句、continue语句、return语句。
- 复合语句
把多个语句用花括号{}括起来组成的一个语句称复合语句。
在程序中应把复合语句看成是单条语句,而不是多条语句。
例如:
{x=y+z;
a=b+c;
printf("%d%d", x, a);
} //这是一条语句;
- 空语句
只有分号“
;
”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。
例如:while( getchar()!='\n' );
二,打开文件的函数:
使用 <stdio.h> 头文件中的 fopen() 函数即可打开文件,它的用法为:
FILE *fopen(char *filename, char *mode);
filename
为文件名(包括文件路径),mode
为打开方式,它们都是字符串。
三,C语言中不允许使用goto语句?
不是不允许,是不提倡,最好不用;
goto使用注意(来自csdn):
不加限制地使用goto:破坏了清晰的程序结构,使程序的可读性变差,甚至成为不可维护的"面条代码"。经常带来错误或隐患,比如它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句。
关于使用goto语句的原则:
(1)使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。
(2)使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。
(3)不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。
(4)应该避免向两个方向跳转。这样最容易导致"面条代码"。
好像不知道什么是面条式代码???我在这里
四,函数若无返回值,则它一定无形参?
说法错误;
一个函数可以有参数,没有返回值;
可以没有参数,有返回值;
可以没参数,没返回值;
可以有参数,有返回值;
参数和返回值没有必然联系
五,原码,补码,反码,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不会;
十六,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语言中函数的组成部分包括函数头和函数体;
十九,模块化程序设计的原则是()和();
书上暂时没找着…
二十,在c程序中,函数可能嵌套定义,也可以嵌套调用(F);
//不能嵌套定义,但可以嵌套调用
二十一,&&和||运算都是双目运算,但是他们的优先级不同?
与运算符的优先级高于或运算符,非和异或高于他们两个;
二十二,一个算法具有包括“零个或多个输出”在内的5个特性(F);
//应该是输入;输出至少要有一个的;
1.输入:在算法中可以有零个或者多个输入
2.输出:在算法中至少有一个或者多个输出
3.有穷行:在执行有限的步骤之后,自动结束不会出现无限循环并且每一个步骤在
可接受的时间内完成
4.确定性:算法的每一个步骤都具有确定的含义,不会出现二义性
5.可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限
的次数完成
二十三, .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日。