C语言练习5
- 选择题
选择题
1,下面代码的结果是:( )
#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
💯答案解析:
😸正确答案:C
strlen是用来获取字符串的有效长度的,结尾标记’\0’不包含在内。
strlen获取的规则非常简单:从前往后依次检测,直到遇到’\0’是就终止检测。
而上题中arr是一个字符数组,不是一个有效的字符串,因为后面没有放置’\0’,因此strlen在求解时,将有效字符检测完之后,还会继续向后检测,直到遇到’\0’是才终止,因此答案为不确定,就看紧跟在’t’之后的第一个’\0’在什么位置。因此:答案选C
2,下面代码输出的结果是:( )
#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
💯答案解析:
😸正确答案:B
本题主要考察变量的访问规则,C语言中:
- 不允许在同一个作用域中定义多个相同名称的变量比如:在一个班级中存在两个名字相同的学生王帅,当老师点王帅回答问题时,那个回答就冲突了
- 允许在不同的作用域中定义多个相同名称的变量比如:两个班级中各有一个王帅,老师在A班中点王帅回答问题,不会有任何歧义
- 不同作用域中定义的变量,在访问时采用就近原则。比如:你们村有一个小伙伴名字叫刘德华,那你在你们村喊刘德华时,你们村的刘德华就会跑过来响应你,而我们世界级别人见人爱的天王他不会理你,因为距离远听不见,但是两个刘德华可以同时存在这个 世界上,只要不在一个村,就不会冲突。
根据以上描述可知,对于以上代码: 1. 全局作用域中的num和main中的num可以同时存在,不会冲突,因为不是同一个作用域2. 在main函数中访问num时,采用就近原则,因此访问的是main中的num,相当于将全局作用域中的num屏蔽了
A:错误:因为两个num不在同一个作用域中,可以通过编译
B:正确,main中访问的是main中的num,而main函数中的num是1,因此打印1
C:错误,应该访问main函数中的num,而不是全局作用域中的num
D:错误,凑选择的
3,关于C语言关键字说法正确的是:( )
A.关键字可以自己创建
B.关键字不能自己创建
C.关键字可以做变量名
D.typedef不是关键字
💯答案解析:
😸正确答案:B
C语言关键字:C语言定义的,具有特定含义、专门用于特殊用途的C语言标识符,也称为保留字 A:错误,关键字是语言自身定义的 B:正确 C:错误,关键字具有特殊含义,不能作为变量名 D:错误,typedef是用来给类型取别名的关键字 因此,选择B
4,关于static说法不正确的是:( )
A.static可以修饰局部变量
B.static可以修全局变量
C.static修饰的变量不能改变
D.static可以修饰函数
💯答案解析:
😸正确答案:C
本题主要考察static的特性
- static修饰变量
a. 函数中局部变量:声明周期延长:该变量不随函数结束而结束
初始化:只在第一次调用该函数时进行初始化
记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
存储位置:不会存储在栈上,放在数据段
b. 全局变量:改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用
c. 修饰变量时,没有被初始化时会被自动初始化为0- static修饰函数
改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用
A:正确,原因参考上述注解 B:正确,原因参考上述注解 C:错误,const修饰的变量不能改变 D:正确,原因参考上述注解 因此:选择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
💯答案解析:
😸正确答案:
答案解析:C
上述代码本来的想法应该是:循环10次,每次循环时如果i == 5则打印i的结果。但if语句中表达式的==写成了赋值,相当于每次循环尽量都是将i的值设置成了5,5为真,因此每次都会打印5。i每次修改成5打印后,i的值永远不会等于10,因此造成死循环 故:死循环的打印5。因此:选择C
6,switch( c )语句中,c不可以是什么类型( )
A.int
B.long
C.char
D.float
💯答案解析:
😸正确答案:D
switch语句中表达式的类型只能是:整形和枚举类型 。D选项为浮点类型,不是整形和枚举类型
7,关于while(条件表达式) 循环体,以下叙述正确的是( )? (假设循环体里面没有break,continue,return,goto等等语句)
A.循环体的执行次数总是比条件表达式的执行次数多一次
B.条件表达式的执行次数总是比循环体的执行次数多一次
C.条件表达式的执行次数与循环体的执行次数一样
D.条件表达式的执行次数与循环体的执行次数无关
💯答案解析:
😸正确答案:B
while循环中,当条件表达式成立时,才会执行循环体中语句,每次执行期间,都会对循环因子进行修改(否则就成为死循环),修改完成后如果while条件表达式成立,继续循环,如果不成立,循环结束 故:while循环条件将会比循环体多执行一次。因此:选择B
8,能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是:( )
A.return 这二个数
B.形参用数组
C.形参用二个指针
D.用二个全局变量
💯答案解析:
😸正确答案:A
A:错误,一个函数只能返回一个结果 B:正确,将形参存在数组中,修改数组中内容,可以通过数组将修改结果带出去C:正确,形参如果用指针,最终指向的是外部的实参,在函数中对指向指向内容进行修改,改变的就是外部的实参 D:正确,全局变量不受函数的结束而结束,在函数中改变全局变量,主调函数中可以看到改变之后的结果
9,于函数调用说法不正确的是:()
A.函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝
B.函数可以传址调用,传址调用的时候,可以通过形参操作实参
C.函数可以嵌套定义,但是不能嵌套调用
D.函数可以嵌套调用,但是不能嵌套定义
💯答案解析:
😸正确答案:C
A:正确,形参按照值的方式传递,将来形参就是实参的一份临时拷贝,修改形参不会影响外部的实参 B:正确,形参按照指针方式传递,将来形参就是实参地址的一份拷贝,形参指向的是实参,修改形参指针指向的内容, 就是在操作实参 C:错误,C语言中,函数不能嵌套定义 D:正确,函数可以嵌套调用,即:A()中调用B(),B()中调用A(),但是要控制好,否则就成为无限递归 。因此,选择C
10,关于以下说法描述正确的是:( )
A.函数的实参只能是变量
B.形参是在函数调用的时候才实例化,才开辟内存空间
C.函数设计应该追求高内聚低耦合
D.有了库函数就不需要自定函数了
💯答案解析:
😸正确答案:C
A:错误,函数的实参可能是变量,也可能是常量,也可能是宏,也可能是指针等等 B:正确,函数没有调用时,形参没有空间 C:正确,高内聚低耦合即:函数体内部实现修改了,尽量不要对外部产生影响,否则:代码不方便维护 D:错误,库函数是语言设计者为了让用户能够更好的使用,而给出的,但并不能解决用户的所有问题,因此其他问题还需要用户自己写方法解决
11,以下叙述中不正确的是:( )
A.在不同的函数中可以使用相同名字的变量
B.函数中的形式参数是在栈中保存
C.在一个函数内定义的变量只在本函数范围内有效
D.在一个函数内复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括号构成的代码)
💯答案解析:
😸正确答案:D
A:正确 不同的函数属于不同的作用域,因此不同的函数中定义相同名字的变量不会冲突 B:正确 在C语言中,函数的形参一般都是通过参数压栈的方式传递的 C:正确 在函数内定义的变量,称为局部变量,局部变量只能在其定义的函数中使用 D:错误 复合语句中定义的变量只能在复合语句中使用 因此:选择D
12,C语言规定,在一个源程序中,main函数的位置( )
A.必须在最开始
B.必须在库函数的后面
C.可以任意
D.必须在最后
💯答案解析:
😸正确答案:C
main函数的位置可以在任意位置,但是如果在主函数之中调用了哪些函数,必须在main函数前对其所调用函数进行生命或包含其被调用函数的头文件。 因此:选择C
13,在上下文和头文件均正常情况下,以下程序的输出结果是()
int x = 1;
do
{printf("%2d\n", x++);
} while (x--);
A. 1
B. 无任何输出
C. 2
D. 陷入死循环
💯答案解析:
😸正确答案:D
前置++:先加1后使用
后置++:先使用后加1
(- -同理)
x++先使用后加一,打印出1,x变2。x–先使用2为真,x变1进入循环。所以陷入死循环打印1
14,以下 C 程序的输出结果是()
#include <stdio.h>
#include <stdlib.h>
int a = 1;
void test()
{int a = 2;a += 1;
}
int main()
{test();printf("%d\n", a);return 0;
}
A.1
B. 2
C. 3
D. 4
💯答案解析:
😸正确答案:A
如果函数内部的全局变量和局部变量同名,那么在函数内部局部变量会屏蔽全局变量,使用局部变量,因此本题中全局变量会被tset()中的局部变量屏蔽,对a的修改不会对全局变量a带来任何影响,所以全局变量的值保持为1.
15,假定 x 和 y 为 double 型,则执行 x=2; y=x+3/2; 后y的值为()
A. 3.500000
B. 3
C. 2.000000
D. 3.000000
💯答案解析:
😸正确答案:D
3/2 == 1 ,x+3/2 == 3,double类型3.000000
16,选择表达式 11|10 的结果(本题数值均为十进制)()
A. 11
B. 10
C. 8
D. 2
💯答案解析:
😸正确答案:A
1011//111010//101011//11
17,以下能对二维数组a进行正确初始化的语句是:( )
A.int a[2][]={{0,1,2},{3,4,5}};
B.int a[][3]={{0,1,2},{3,4,5}};
C.int a[2][4]={{0,1,2},{3,4},{5}};
D.int a[][3]={{0,2},{},{3,4,5}};
💯答案解析:
😸正确答案:B
对于二维数组int array[M][N], 说明如下:
- M和N都必须为常数,
- M代表数组有M行,N代表每行中有N个元素
- 其中M可以省略,省略后必须给出初始化表达式,编译器从初始化结果中推断数组有多少行
- N一定不能省略,因为N省略了就不能确定一行有多少个元素,也不能确定数组有多少行
A:错误,参数上述说明 B:正确,参考上述说明 C:错误,数组有两行,但是初始化给了三行 D:错误,初始化不允许{0,2}该种情况存在 。因此,选择B
18,给出以下定义:
char acX[] = "abcdefg";
char acY[] = { 'a','b','c','d','e','f','g'};
以下说法正确的是( )
A.数组acX和数组acY等价
B.数组acX和数组acY的长度相同
C.sizeof(acX)>sizeof (acY)
D.strlen (acX)>strlen (acY)
💯答案解析:
😸正确答案:C
acX和acY都是字符数组,但是初始化表达式不同,acX和acY的区别如下:
acX:数组中总共有8个元素,分别是:‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘\0’
acY:数组中总共有7个元素,分别是:‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’
sizeof这里求的是数组大小,数组大小等于有效元素个数*每个元素的大小。sizeof(acX) = 8,sizeof(acY) = 7
strlen求的是字符串长度,从首元素开始计算,遇见‘\0’停止,由于acY数组没有’\0‘,所以strlen(acY)的结果是个随机值。 因此,选择C
19,下面代码的结果是:( )
#include <stdio.h>
int main()
{int i = 1;int ret = (++i)+(++i)+(++i);printf("ret = %d\n", ret);return 0;
}
A.10
B.12
C.9
D.程序错误
💯答案解析:
😸正确答案:D
表达式(++i)+(++i)+(++i),只有操作符的优先级和结合性,没法确定唯一计算路径
所以这个表达式可能因为计算顺序的差异导致结果是不一致的,所以表达式是错误的表达式。
可以在VS和Linux gcc测试,结果可能有差异。
20,下面代码的结果是:
#include <stdio.h>
int i;
int main()
{i--;if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0;
}
A.>
B.<
C.不输出
D.程序有问题
💯答案解析:
😸正确答案:A
C语言中,0为假,非0即为真。
全局变量,没有给初始值时,编译其会默认将其初始化为0。i的初始值为0,i–结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A
这道题其实很隐蔽,真是虾仁猪心!!!
💘后期会推出更多C语言练习题,希望大家与我共同进步,早日成为大佬!