编译和链接

1. 下面关于C语言的编译和链接说法错误的是?

A.C语言是一门编译型计算机语言

B.写出来的C语言代码直接就可以运行的

C.C语言代码需要经过编译和链接生成可执行程序才能运行的

D.C语言代码经过编译生成目标文件,目标文件和链接库通过链接生成可执行程序

答案解析:

C语言是一门编译型计算机语言,代码需要经过编译和链接生成可执行程序才能运行的,C语言代码经过编译生成目标文件,目标文件和链接库通过链接生成可执行程序


2. 关于集成开发环境描述错误的是?

A.集成开发环境简称IDE

B.集成开发环境一般都是将编辑、编译、链接、调试等功能集成在一起的一个开发环境

C.集成开发环境就是编译器

D.集成开发环境使用起来方便,大大提升了开发和调试的效率

答案解析:

集成开发环境中集成了编译器,如果说集成开发环境就是编译器,有些片面了


3. 关于C语言中源文件和头文件说法正确的是?

A.C语言的源文件的后缀是.cpp

B.头文件没什么用,只要有源文件就行了

C.C语言中源文件的后缀是.c,头文件的后缀是.h

D.C语言的源文件可以没有后缀

答案解析:

很多C语言编译器就是通过文件的后缀来区分是源文件还是头文件的,一般都是要明确的写出文件后缀的

头文件的后缀是.h,是header的意思

源文件的后缀是.c

在稍微复杂的C语言程序中,头文件是很有必要的,一般是用来函数声明、类型声明等


4. C语言规定,在一个源程序中,main函数的位置( )

A.必须在最开始

B.必须在库函数的后面

C.可以任意

D.必须在最后

答案解析:

main函数的位置可以在任意位置,但是如果在主函数之中调用了哪些函数,必须在main函数前对其所调用函数进行生命或包含其被调用函数的头文件

因此:选择C


5. 关于main函数错误的是?

A.main函数是程序的入口

B.一个C语言程序中可以写多个main函数

C.main函数的名字是可以随便改的,比如:mian

D.main函数的名字是固定的,一个工程中,有且仅有一个main函数

答案解析:

一个C语言程序中的main函数,有且仅有一个

main函数的名字是固定的,编译器以main函数作为程序的入口,程序是从main函数的第一行开始执行的


6. printf和库函数描述错误的是?

A.printf是库函数,不需要包含头文件就可以使用

B.库函数是C语言标准约定的,由各个C语言编译器的厂商实现的,所以各个编译器的库函数使用和功能是一样的,但是内部实现是有差异的。

C.printf函数是用来在标准输出上打印格式化的信息的

D.printf函数打印字符使用%c,打印整数使用%d指定格式

答案解析:

printf是库函数,必须含头文件才能正确使用


7. 下面哪个不是关键字:( )

A.int

B.struct

C.define

D.continue

答案解析:

C语言关键字C语言定义的,具有特定含义、专门用于特殊用途的C语言标识符,也称为保留字

define不是关键字,是编译器实现的,用来定义宏的预处理指令,不是C语言中的内容。

int、struct和continue都是C语言中包含的关键字

因此:选择C


8. 用在switch语言中的关键字不包含哪个?( )

A.continue

B.break

C.default

D.case

答案解析:

答案解析:

switch是用来进行多分支选择的语句,一般结构是:

switch(变量表达式)

{

case xx1:

// ...

break;

case xx2

// ...

break;

default:

// ...

}

当变量表达式的内容与某个case后的常量相等后,就执行该case下的语句,break表示该case以后的内容不会执行如果没有跟break,会继续执行当前case之后的case分支

当变量表达式的内容没有与那个case匹配,就会执行default下的内容

switch中常用的关键字case 、break、 default,当然case中语句比较复杂时,可能会用if进行判断。

continue用来结束本次循环的,而switch不是循环,因此其中不能使用continue关键字。

因此:选择A


9. 关于C语言关键字说法正确的是:( )

A.关键字可以自己创建

B.关键字不能自己创建

C.关键字可以做变量名

D.typedef不是关键字

答案解析:

C语言关键字C语言定义的,具有特定含义、专门用于特殊用途的C语言标识符,也称为保留字

A:错误,关键字是语言自身定义的

B:正确

C:错误,关键字具有特殊含义,不能作为变量名

D:错误,typedef是用来给类型取别名的关键字

因此,选择B


10. 关于字符的ASCII编码错误的是?

A.小写字母的ASCII码值+32就能得到对应的大写字母的ASCII码值

B.ASCII码值从0~31 这32个字符是非打印控制字符,在界面上不显示任何东西,比如:蜂鸣、回车、换行

C.数字字符0~9的ASCII码值是连续递增的

D.最初ASCII编码中只有128个字符的编码

答案解析:

小写字母的ASCII码值-32就能得到对应的大写字母的ASCII码值

小写字母的ASCII码值比对应的大写字母的ASCII码值更大的


11. 字符串的结束标志是:( )

A.是’0’

B.是EOF

C. 是’\0’

D.是空格

答案解析:

C语言规定以’\0’作为有效字符串的结尾标记

A:错误,是’\0’不是字符0

B:EOF一般用来作为检测文本文件的末尾

C:正确

D:明显错误

因此:选择C


12. 下面代码的结果是:( )

#include <stdio.h>
#include <string.h>

int main()
{
char arr[] = {'b', 'i', 't'};
printf("%d\n", strlen(arr));
return 0;
}

A.3

B.4

C.随机值

D.5

答案解析:

strlen是用来获取字符串的有效长度的结尾标记'\0'不包含在内

strlen获取的规则非常简单:从前往后依次检测,直到遇到'\0'是就终止检测

而上题中arr是一个字符数组,不是一个有效的字符串,因为后面没有放置’\0’,因此strlen在求解时,将有效字符检测完之后,还会继续向后检测,直到遇到'\0'是才终止,因此答案为不确定,就看紧跟在’t’之后的第一个’\0’在什么位置。

因此:答案选C


13. 下面那个不是转义字符?

A.’\n’

B.’\060’

C.’\q’

D.’\b’

答案解析:

A:’\n’ 转义字符,代表换行

B:’\060’ 转义字符,060八进制数据,十进制为48,表示ASCII码为48的’0’

C:’\q’ 什么都不是

D:’\b’ 转义字符,表示退格

因此:选择C


14. 下面程序的结果是:( )

#include <stdio.h>
#include <string.h>
int main()
{
printf("%d\n", strlen("c:\test\121"));
return 0;
}

A.7

B.8

C.9

D.10

答案解析:

strlen获取字符串的有效长度不包括'\0'

“c:\test\121”: 在该字符串中,\t是转移字符,水平制表,跳到下一个tab的位置;而\121表示一个字符,是讲121看做8进制数组,转换为10进制后的81,作业为ASCII码值的字符,即:字符'Q',故上述字符串实际为:"c: estQ",只有7个有效字符

因此:选择A

15. 注册博客,写第一篇博客

![185cm小伙与C语言的那些事——C语言开端-CSDN博客]https://blog.csdn.net/AcsdnHZB/article/details/137152637

16. 注册gitee并提交提1次写的代码

![注册github并提交提1次写的代码]https://github.com/githubHZB


注释

1.关于注释说法不正确的是?

A.注释是用来解释代码的,在代码中是适当的加上注释有利于代码的阅读和多人协作

B.注释基本没啥用,主要给自己看的

C.注释是给程序员看的,编译器在预处理阶段就会删除注释的

D.注释有C++注释风格,有C语言注释风格,推荐C++注释风格

答案解析:

注释还是非常有用的,要学会写注释,能写注释,写好注释对工程中多人协作很关键的,写注释是一个程序员的好习惯。面试写代码,如果加上注释也是好的加分项

因此:选择B


2.关于C语言布尔类型错误的是?

A.C语言布尔类型是_Bool,使用需要包含头文件stdbool.h

B.布尔类型变量的取值是:true或者false

C.布尔类型是专门用来表示真和假的类型

D.布尔类型是C99标准之前就有的

答案解析:

布尔类型是C99标准中引入的;

在早期的C语言标准(如ANSI C和C89)中,没有明确定义布尔类型。通常,程序员使用整数类型(如int)来表示布尔值,其中0表示假(false)非零值表示真(true)

然而,在C99标准中引入了新的布尔类型(stdbool.h头文件),定义了bool类型true/false常量。布尔类型只有两个取值:true和false,用于表示真和假

因此:选择D


3.下面哪个不是C语言内置的数据类型:

A.char

B.double

C.struct Stu

D.short

答案解析:

C语言中内置类型包括:

char    //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数

struct关键字是用户用来自定义的结构体类型不属于C语言的内置类型。

因此:选择C


4.下面代码输出的结果是:( )

#include <stdio.h>
int num = 10; //全局变量
int main()
{
int num = 1; //局部变量
printf("num = %d\n", num);
return 0;
}

A. 程序有问题,不能编译

B.输出1

C.输出10

D.输出0

答案解析:

局部变量的优先级高于全局变量

main函数中,局部变量num覆盖了全局变量num,导致局部变量num的值为1。

printf函数输出的是局部变量num的值,即1。

因此:选择C


5.关于C语言变量说法错误的是?

A.变量是用来描述生活中经常发生变化的值

B.变量可以分为局部变量和全局变量

C.局部变量是放在内存的静态区的,全局变量是放在内存的栈区

D.当全局变量和局部变量名字相同的情况,且都可以使用的时候,局部变量优先

答案解析:

局部变量是放在内存的栈区的,全局变量是放在内存的静态区

因此:选择C


6.关于C语言算术操作符说法正确的是?

A.除号两边都是小数才能执行小数除法

B.%操作符的操作数可以是整数,也可以是小数

C.%操作符计算的结果是两个操作数整除之后的商

D.负数求模的规则是,结果的正负号由第一个运算数的正负号决定。

答案解析:

A:除号两边只要有一个是小数,就执行小数除法

B:%操作符的操作数只能是整数

C:%操作符计算的结果是两个操作数整除之后的余数

D.负数求模的规则是,结果的正负号第一个运算数正负号决定

D举例:

#include <stdio.h>

int main()
{
printf("%d\n",-5%2); //输出-1
printf("%d\n",-5%-2); //输出-1
printf("%d\n",5%-2); //输出 1

return 0;
}

因此:选择D


7.下面代码输出的结果是啥:

#include <stdio.h>
int main()
{
int a = 7;
int b = 2;
float c = 2.0f;
printf("%d\n", a / b); // a = 7, b = 2, 输出3
printf("%f\n", a / c); //float 类型输出结果为3.5,但小数点后默认保留6位有效数字
return 0;
}

A.3 3.500000

B.3.500000 3.500000

C.3.500000 3

D.3 3

答案解析:

整除浮点除法的结果不同

整除的结果是浮点除法的结果是商和余数小数部分

2个整数相除,执行的是整数除法,计算的结果也是整数

除法的2个操作数只要有一个数是浮点数,执行的就是小数除法,所以a/c是按照小数除法计算的,结果就是3.5

a/b 是按照整数除法计算的,结果是3.

因此:选择D


8.下面代码的结果是:( )

#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a;
b = ++c, c++, ++a, a++;
b += a++ + c;
printf("a = %d b = %d c = %d\n:", a, b, c);
return 0;
}

A.a = 8 b = 23 c = 8

B.a = 9 b= 23 c = 8

C.a = 9 b = 25 c = 8

D.a = 9 b = 24 c = 8

答案解析:

++运算符:分为前置++后置++

前置++先加1,后使用,即先使用变量中内容,然后给结果加1

后置++先使用变量中内容,整个表达式结束时,给变量加1

#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a;
// ++a:加给a+1,结果为6,用加完之后的结果给c赋值,因此:a = 6 c = 6
//++a -> a=6
//c = a -> c=6
b = ++c, c++, ++a, a++; //依次执行 b= ++c, c++, ++a, a++
// 这里先算b=++c, b得到的是++c后的结果,b是7
// b=++c 和后边的整体构成逗号表达式,依次从左向右计算的。
// 表达式结束时,c++和,++a,a++会给a+2,给c加1,此时c:8,a:8,b:7

// ++c -> c=7
//b = 7
// c++ -> c=8
// ++a -> a=7
// a++ -> a=8
// 总结:a=8 , b=7, c=8

b += a++ + c;
// a先和c加,结果为16,在加上b的值7,比的结果为23,最后给a加1,a的值为9

//1.展开:b= b + (a++ + c)
//2.b= b + (a++ + 8)
//3.b= b + (8 + 8), a++ ——> b= 7 + 16 = 23
//4.a++ ——> a = 9

printf("a = %d b = %d c = %d\n:", a, b, c); // a:9, b:23, c:8
return 0;
}

因此:选择B


scanf和printf

1.关于scanf函数说法正确的是?

A.scanf中也有占位符,占位符和后边的参数提供的地址一一对应。

B.scanf()处理所有占位符时,会自动过滤起首的空白字符,包括空格、制表符、换行符

C.scanf的占位符%s表示读取一个字符串,遇到空白字符也全部读取

D.scanf是库函数,库函数不需要包含头文件

答案解析:

B:scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符,scanf输出字符占位符的时候,不忽略空白字符总是返回当前第一个字符,无论该字符是否为空格

C:scanf的占位符%s表示读取一个字符串,遇到空白字符就停止读取

D:scanf需要包含stdio.h这个头文件的

因此: 选择A

2.关于printf函数说法错误的是?

A.printf()的作用是将参数文本输出到屏幕。它名字里面的f代表format(格式化),表示可以定制输出文本的格式。

B.printf()不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。

C.printf()可以在输出文本中指定占位符,“占位符”,就是这个位置可以用其他值代入。

D.printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n个

答案解析:

printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个

3.下面程序输出的结果是啥:

#include <stdio.h>

int main()
{
printf("%5d\n", 123456);
return 0;
}

A.12345

B.123456

C.23456

D.0

答案解析:

printf()允许限定占位符的最小宽度%5d表示这个占位符的宽度至少为5位。如果不满5位,对应的值的前面会添加空格如果超过5位,正常输出就行5是最少输出5位

因此: 选择B

4.关于if语句说法正确是:( )

A.if语句后面只能跟一条语句

B.if语句中0表示假,1表示真

C.if语句是一种分支语句,可以实现单分支,也可以实现多分支

D.else语句总是和它的对齐的if语句匹配

答案解析

A:错误,if之后可以跟多条语句,跟多条语句时需要使用{}括起来

B:错误,0表示假,非零表示真

C:正确

D:不一定,要看具体的代码,如果代码不规范,可能没有对齐,比如:

if()
if()
else
;

上述else虽然是和外层if对齐,但是会和内部if进行匹配。

因此,选C

5.下面代码执行的结果是:( )

#include <stdio.h>

int main()
{
int i = 0;
for (i = 0; i<10; i++)
{
if (i = 5)
printf("%d ", i);
}
return 0;
}

A.1 2 3 4 5 6 7 8 9 10

B.5 5 5 5 5 5 5 5 5 5

C.死循环的打印5

D.0 1 2 3 4 5 6 7 8 9

答案解析

上述代码本来的想法应该是:循环10次,每次循环时如果i==5则打印i的结果。

但if语句中表达式的==写成了赋值,相当于每次循环尽量都是将i的值设置成了5,5为真,因此每次都会打印5

i每次修改成5打印后,i的值永远不会等于10,因此造成死循环

故:死循环的打印5

因此:选择C