本文前段可能让你索然无味,但是后劲大.
如有解释错误的地方,欢迎在评论区指正
1.判断下列常量不合法的是:
选项 | Value |
---|---|
A | 0128 |
B | -45 |
C | 123.5e4 |
D | ’ \n ’ |
答案:A
(c语言常量中以0开头为8进制数,其中不可能出现8;)
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
- 小数形式中必须有整数部分和小数部分,或者两者同时存在
- 指数形式中必须有小数点和指数 e/E,或者两者同时存在
字符串常量要用双引号 “ ” 括起来
2. 以下标识符合法的是:
选项 | Value |
---|---|
A | if |
B | void |
C | _3w |
D | 2a |
答案:C
标识符由数字、字母和下划线组成,且开头只能是字母或下划线。
3.以下变量初始化合法的是:
选项 | Value |
---|---|
A | int a=b; |
B | int 0 == sum; |
C | float x,y,z; |
D | char c; c=’ c '; |
答案:D
其中A、C均未初始化,而B初始化错误;
4.有以下程序:
#include <stdio.h>
void fun(int *a,int *b)
{
*a++;
*b=*b-1;
}
void main()
{
int c = 2,d = 3,*p = &c;
fun(p,&d);
printf("%d %d",c,d);
}
选项 | Value |
---|---|
A | 2,3 |
B | 2,2 |
C | 3,2 |
D | 3,3 |
答案:B
这个程序首先定义了两个整型常量 c、d 并分别赋值,还定义了一个指针p,指向c的内存地址;然后进入fun函数,在fun函数中对 p 指针的指向的内存地址做了自增运算,因为开始定义的int型,所以p指针的指向地址往后移4,且此时p指针不在指向c常量 则c的值不变;然后对b指针指向的d做减一操作后结束函数;因此最后输出的是(2,2)
5.当变量c的值不为2、4、6时,值也为“真”的表达式是( )。
答案为:B
c语言逻辑运算符中:&& 与运算符“一假为假,全真为真”;|| 或运算符“全假为假,一真为真”;
整题的意思是:可以找出一组c不是2、4、6的值让选项为真,
则当c的值为3、5、7时,A选项全为假,且为或运算,全式为假;
当c的值为7、8、9时,B选项(c>=2&&c<=6)为假,而(c=3)和(c!=5)为真,或运算全式为真;
当c的值为3、5、7时,C选项 (c>=2&&c<=6)为假,且(c%2)为1再取反为0,与运算全式为假;
当c的值为3、5、7时,D选项(c>=2&&c<=6)为假,且(c%2!=1)也为假,与运算全式为假;
6.以下叙述中错误的是( )。
选项 | Value |
---|---|
A | 在程序中凡是以“ # ”开始的语句行都是预处理命令行 |
B | 预处理命令行的最后不能以分号表示结束 |
C | #define MAX 是合法的宏定义命令行 |
D | C程序对预处理命令行的处理是在程序执行的过程中进行的 |
答案是:D
其中A选项比较模糊,因为如果是在注释中,那#define就失效了,就不能算是个预处理命令行
如下:
/*
#define MAX
*/
B选项和C选项正确,D选项对预处理命令行的处理是在程序执行之前之前完成的(编译),不是程序执行的过程中,所以才称之为预处理。
7.变量a中的数据用二进制表示的形式是01011101,变量b中的数据用二进制表示的形式是11110000.若将a的高4位取反,低4位不变,所要执行的运算是( )。
选项 | value |
---|---|
A | a^b |
B | a1b(此处1为竖直的一杠(或运算符),因markdown格式的限制在表格中打不出来) |
C | a&b |
D | a<<4 |
答案:A
这道题涉及到c语言的 “位运算” ,因为在计算机内部(笼统的说)数值的储存都是以二进制的方式进行;而计算机对二进制数进行的一些运算就叫做位运算
下面列举位运算的一些类别;
则对照位运算的运算规则,我们可以得到答案为A;
8.下面程序段的运行结果是( )。
char *s = "abcde";
s+=2;
printf("%d",s);
选项 | Value |
---|---|
A | cde |
B | 字符 ’ c ’ |
C | 字符 ’ c ’ 的地址 |
D | 无确定的输出结果 |
答案为:C
开始的时候 s 为一个指向’‘abcde’‘字符串的地址,也就是字符串首字母’a’的地址,然后s = s+2后,指针的位置往后移2位指向’c’,利用%d输出的话,为16位的字符’c’的地址
9.阅读下列程序,则执行后的结果为( )。
#include "stdio.h"
main(){
int c[][4] = {1,2,3,4,5,6,7,34,213,56,62,3,23,12,34,56};
printf("%x,%x\n",c[2][2],*(*(c+1)+1));
}
这道题在2020c语言模考的时候是显示缺失的,只有一部分,导致我一直看不懂这是什么意思,这里要吐槽一下官方,后来去查了一下找到了原题。(我的浏览器没问题,没任何缩放。)
答案为:A
首先,prinf("%x,%x\n")中用的小写的x,表示用16进制输出数,并且格式为小写的abcdef,排除D,然后要注意的一点就是,二维数组数组名代表数组的首地址,既(c+1)代表二维数组的第1行(从0行开始计数),(c+1)+1就是第一行的第一个数,所以是6
10.C语言结构体类型变量在程序运行期间( )。
选项 | Value |
---|---|
A | TC环境在内存中仅仅开辟一个存放结构体变量地址的单元 |
B | 所有的成员一直驻留在内存中 |
C | 只有最开始的成员驻留在内存中 |
D | 部分成员驻留在内存中 |
答案为:B
*结构类型变量与其他基础类型变量一样,在某个代码块内,只要这个变量存在,那么其内部所有成员都存在。
而在TC环境中,定义结构体变量后,编译为其分配一批连续的单元存放各成员值。 *
TC环境度娘介绍:
而在TC和VC环境下,内存分配的差异可以看这篇博文;
简单来说就是在TC环境下,任何类型的指针内存都为2,而在VC环境中内存有对齐机制,总内存大小与结构体内变量的排序有关。
11.设有定义语句 int (*f)(int);则以下叙述正确的是( )。
选项 | Value |
---|---|
A | f是基类型为 int 的指针变量 |
B | f是指向函数的指针变量,该函数具有一个int类型的形参 |
C | f是指向int类型一维数组的指针变量 |
D | f是函数名,该函数的返回值是基类型为int类型的地址 |
答案为:B
这里要辨析清楚
int *f() : 表示函数的功能是: 返回一个地址
int (*f)() : 表示 这是一个函数的指针.它要指向一个函数才能有用.指向一个函数之后道可以用它来代替该函数.之后使用这个指针相当于使用该函数.
12.在16位IBM-PC机上使用C语言,若有如下定义,则结构变量b占用内存的字节数为( )。
struct data
{
int i;
char ch;
double f;
}b;
选项 | Value |
---|---|
A | 1 |
B | 2 |
C | 7 |
D | 11 |
答案为:C
因为在16位PC机上,int类型占2字节,char占1字节,double类型占4字节,三者相加为7
13.设有如下程序段,则执行p=s;语句后,以下叙述正确的是( )。
char s[20]="Beijing", *p;
p = s;
选项 | Value |
---|---|
A | 可以用*p表示s[0] |
B | s数组中元素的个数和p所指字符串长度相等 |
C | s和p都是指针变量 |
D | 数组s中的内容和指针变量p中的内容相同 |
答案为:A
B:s数组元素的个数为7,而p所指字符串长度为20;
C:s是一维数组,p是指针变量
D:应改为数组s中的内容和指针变量p所指数组的内容相同,因为单单说指针p的内容只为16进制的地址
————————————————————————————————————————————————————
以下为多选题(紧张又刺激)
14.以下可以定义为用户标识符的有:
为什么又要说这个很捞的问题呢,因为对于新手来说,有时候就是容易错啊:)
选项 | Value |
---|---|
A | scanf |
B | short |
C | _3com |
D | int |
答案为:A,C
有人就会问了,scanf怎么可以是标识符呢,我每天老见它,一天好几次了,这么熟还可以是标识符!!???
啊~骚年对的,它可以是标识符,不信你看看c语言的关键字里面有没有它
没有吧~,其实scanf只是你经常使用的函数,并不是关键字,因此可以使用它来当关键字,但是在日常的编程实践中还是不要使用的好哇
15.以下选项中不是c语言合法整数的是( )
选项 | Value |
---|---|
A | 10110 |
B | 0238 |
C | 0Xffa |
D | x2a2 |
答案为:B,D
B:以0开头为8进制数,式子不能有8出现;
D:x2a2为16进制,但开头没有0x的标识
16.以下叙述错误的是( )
选项 | Value |
---|---|
A | c语言函数可以嵌套使用,如fun(fun(x)) |
B | c语言程序是由过程和函数组成的 |
C | c语言函数不可以单独编译 |
D | c语言中除了main函数,其他函数不可以作为单独文件形式存在 |
答案为:BCD
B:C语言程序中没有过程的概念,C语言执行的基本单位是函数,一个程序可以有多个函数,但main(),有且只能有一个,各函数之间是平行关系,不允许嵌套定义但可以嵌套调用.
C:可以单独编译,例如库函数就是把函数放到库里,把一些常用到的函数编译完放到一个文件里,供不同的人进行调用。
D:c语言中函数与文件没有直接关系,因此任何函数都可以作为单独文件形式存在。将main函数作为单独文件只是因为程序简单等原因没有特意给主文件命名
17.以下4个选项中,可以看作是一条语句的有( )
选项 | Value |
---|---|
A | { ; } |
B | a=0,b=0,c=0; |
C | if(a>0); |
D | if(b==0) m =1;n=2; |
答案为:ABC
A为复合语句,在程序中将复合语句看为一条语句,其中D有两条语句,不骜述
18.对Do-while语句描述正确的是( )
选项 | Value |
---|---|
A | do-while 语句构成的循环可以使用 break 语句退出循环 |
B | do-while 语句构成的循环必须使用 break 语句退出循环 |
C | do-while 语句构成的循环 , 当 while 中的表达式值为非零时结束循环 |
D | do-while 语句构成的循环 , 当 while 中的表达式值为零时结束循环 |
答案为:AD
B:do-while语句构成的循环也可以在当不满足while条件后退出
C:应该是while表达式值为0(假)时结束循环
19.有定义语句:int x,y; 若要通过scanf("%d,%d",&x,&y); 语句使变量x得到数组11,变量y得到12,下列四组输入正确的是( )
选项 | Value |
---|---|
A | 11 12< 回车 > |
B | 11,< 空格 >12<回车 > |
C | 11,12< 回车 > |
D | 11,< 回车 > 12< 回车 > |
答案为:BCD
c语言中scanf函数不读入键盘输入的空格,且"%d,%d"两个%d用逗号隔开,因此我们在键盘上输入时也要与其保持一致,输入逗号
20.以下对switch语句和break语句中有描述错误的有( )
选项 | Value |
---|---|
A | 在 switch 语句中必须使用 break 语句 |
B | break 语句只能用于 switch 语句 |
C | 在 switch 语句中 , 可以根据需要使用或不使用 break 语句 |
D | break 语句是 switch 语句的一部分 |
答案为:ABD
A:在switch中break也不是必须使用的,break只是跳出这个循环或switch。如果你不用break的话,那么在执行完目标后,继续执行下面的case。不过一般来说,break都要使用的。B、D错误不多BB了
21.已知:int x=1,y=2,z=3;则值不为0的表达式是( )
选项 | Value |
---|---|
A | x<=y |
B | x&&y |
为什么要放图片???,因为markdown表格里面 “| |” 打不出来,如果有大神会请教教我:)
答案为:ABD
此例我只讲一下CD两种情况,首先来一波速记C语言运算优先级
这个口诀可以记一下~ 当然其中还有一些细节需要你自己去查一下
!((x<y)&&!z||1) :首先()的优先级最高,则(x<y)为1 ;然后!的优先级第二,对z取反为0,再是&&,1&&0为0,接着为0||1为1,最后!1为0,结束;我简直是用完了我这辈子会的全部连接词
然后还有一点就是D里面的y-z为-1,在c语言中-1也为真,只有0才是假
22.一下描述正确的是( )
选项 | Value |
---|---|
A | 调用函数时 , 实参可以是表达式 |
B | 调用函数时 , 实参与形参可以共用内存单元 |
C | 调用函数时 , 将为形参分配内存单元 |
D | 调用函数时 , 实参与形参的类型必须一致 |
答案为:ACD
这波啊,我们直接解释B
函数在调用参数时,如果实参是表达式,则表达式的结果传入形参。形参和实参之间进行数据的拷贝,当然需要为形参临时分配内存单元,函数调用完成之后,形参分配的单元被系统收回。
23.已知int a =2;则正确的赋值表达式是
选项 | Value |
---|---|
A | a+=a-=(a=3) |
B | a=int(-2.3) |
C | a=a*3=2 |
D | a%3 |
答案为:AB
C中a*2不能做左值,D中只是a对3进行取余,而没有赋值操作
24.下列对c语言逻辑运算符两侧的运算对象的数据类型描述不正确的是( )
此题存在争议性
选项 | Value |
---|---|
A | 只能是 0 或 1 |
B | 只能是 0 或非 0 正数 |
C | 可以是整型或字符型数据 |
D | 可以是任何类型的数据 |
答案是:ABD
首先排除AB,然后对于C和D网上有不同的说法,所以要骚年你自己掂量掂量啊~
—————————————————————————————————————————————————
下面是判断题~
25.(double)a乘以2是把a乘以2的结果强制转换为双精度浮点型。( )
答案:错误
应该解释为是将a先强制转换为双精度浮点型,然后再进行a乘以2的运算;如果按照题目来说应该是(double)(a*2)
26.结构体中的成员不可以与结构体变量同名。( )
答案:错误
这道题咱也不知道怎么解释,记着就好
27.变量的存储类型指出了变量的作用域和寿命。( )
答案:正确
按照变量的作用域(即从空间)角度分:可以分为全局变量和局部变量。
按照变量的生存期(即从时间)角度分:可以分为静态存储方式和动态存储方式。静态存储方式:是指在程序运行期间分配固定的存储空间的方式。动态存储方式:是在程序运行期间根据按需分配进行动态的分配存储空间方式。
用户存储空间可以分为程序区、静态存储区、动态存储区。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序运行完毕就释放。程序执行时它们占据固定的内存单元,而不动态分配和释放。
28. 自动类型变量可以定义在函数体外,这时应加说明符auto。( )
答案:错误
首先auto为函数内用于声明变量是自动类型的变量的关键字
用extern声明外部变量,目的是可以在其它的文件中调用
29.使用sizeof运算符可以求得某种类型和某个变量在内存中占的字节数,不能求得某个表达式的类型在内存中所占的字节数。( )
答案:错误
我觉得下面这篇博文比我要讲的好
30.在引用结构体类型的变量时,如果成员本身又是一个结构体类型,则可以再次使用取成员符“ . ”,这样一级一级找到最低的一级的成员( )
答案:正确
如下示范
struct Birthday{ //声明结构体 Birthday
int year;
int month;
int day;
};
struct Student{ //声明结构体 Student
char name[20];
int num;
float score;
struct Birthday birthday; //生日
}stu1;
则使用stu1.birthday.year 访问出生的年份。