Appearance
《C语言程序设计》第二学期重修试卷B (精选04)
一、选择题(本大题共20小题,每小题2分,共40分)
- 设有说明语句:
char a = '\72';则变量a包含的字符个数为 ( )- A. 4 个字符
- B. 3 个字符
- C. 2 个字符
- D. 1 个字符
查看答案与解析
答案:D
解析: 在 C 语言中,\ddd 表示 1 到 3 位八进制数所代表的字符。\72 是一个八进制转义字符,代表一个字符(八进制 72 转换为十进制为 58,对应 ASCII 码中的冒号 :)。因此变量 a 包含 1 个字符。
难度: ⭐⭐
考点: #转义字符 #字符常量
💡 学习锦囊
📖 相关公式与知识点:
- 八进制转义字符:格式为
\ddd,其中d代表 0-7 的八进制数字。 - 十六进制转义字符:格式为
\xhh,其中h代表 0-9、a-f 的十六进制数字。 - 无论转义序列多长,最终都只代表一个字符。
思路分析
遇到反斜杠 \ 开头的字符时,应优先识别其是否为转义字符。
易错点
- 误将
\72拆开计算为\、7、2三个字符。 - 混淆转义字符的字面长度与实际代表的字符个数。
🔄 举一反三
- 字符常量
'\x2A'包含几个字符?查看练习答案与解析
答案:1个 解析:
\x2A是十六进制转义字符,代表一个字符(十进制 42,对应 ASCII 码中的*)。 - 字符串
"\\72"包含几个字符(不含结束符)?查看练习答案与解析
答案:3个 解析:
\\是转义的反斜杠本身(1个字符),7是普通字符(1个),2是普通字符(1个),共 3 个字符。
- 在 C 语言中,数字
029是一个 ( )- A. 八进制数
- B. 十六进制数
- C. 十进制数
- D. 非法数
查看答案与解析
答案:D
解析:
- C 语言中以数字
0开头的整型常量代表八进制数。 - 八进制数的数码范围是
0~7。 - 数字
029包含了数码9,这超出了八进制的数码范围,因此是一个非法数。
难度: ⭐
考点: #数制表示 #八进制
💡 学习锦囊
📖 相关公式与知识点:
- 八进制常量:以
0开头,如012。
思路分析
检查后续每一位数字是否都在 0~7 的范围内。
🔄 举一反三
- 下列常量中,不合法的十六进制数是 ( )
- A.
0x12 - B.
0xFG - C.
0XABC
查看练习答案与解析
答案:B 解析:十六进制的有效字符为
0-9和A-F。 - A.
- 有如下程序:
main()
{
int y=3, x=3, z=1;
printf("%d%d\n", (++x, y++), z+2);
}2
3
4
5
运行该程序的输出结果是 ( )
- A. 34
- B. 42
- C. 43
- D. 33
查看答案与解析
答案:D
解析:
- 逗号表达式
(++x, y++)的求值顺序是从左到右,整个表达式的值是最后一个子表达式的值。首先执行++x,x变为4。随后执行y++。后缀自增返回y当前的值3。 - 第二个打印项
z+2值为3。
难度: ⭐⭐
考点: #逗号表达式 #自增运算符
💡 学习锦囊
📖 相关公式与知识点:
- 逗号表达式:
(表达式1, 表达式2, ..., 表达式n)的值等于表达式n的值。
🔄 举一反三
- 执行语句
int a=1, b=2, c; c = (a++, ++b);后,c的值是多少?查看练习答案与解析
答案:3 解析:逗号表达式取最后一项的值。
- 有如下程序段:
int a=14, b=15, x;
char c='A';
x = (a && b) && (c < 'B');2
3
执行该程序段后,x 的值为 ( )
- A. true
- B. false
- C. 0
- D. 1
查看答案与解析
答案:D
解析:a && b 得 1(真);c < 'B'(即 'A' < 'B')得 1(真)。1 && 1 的结果为 1。
难度: ⭐
考点: #逻辑运算符 #关系运算符
💡 学习锦囊
📖 相关公式与知识点:
- C 语言传统的逻辑真用整数
1表示。
🔄 举一反三
- 表达式
3 > 2 || 1 && 0的结果是?查看练习答案与解析
答案:1 解析:
&&的优先级高于||。
- 如下程序:
main()
{
int x=1, a=0, b=0;
switch(x)
{
case 0: b++;
case 1: a++;
case 2: a++; b++;
}
printf("a=%d, b=%d\n", a, b);
}2
3
4
5
6
7
8
9
10
11
该程序的输出结果是 ( )
- A. a = 2 , b = 1
- B. a = 1 , b = 1
- C. a = 1 , b = 0
- D. a = 2 , b = 2
查看答案与解析
答案:A
解析:x=1 进入 case 1。因没有 break,依次向下穿透执行 case 1 及 case 2。a 自增两次变为 2,b 自增一次变为 1。
难度: ⭐⭐
考点: #switch语句 #case穿透
💡 学习锦囊
📖 相关公式与知识点:
- 只有遇到
break才会跳出switch。
🔄 举一反三
- 若在
case 1后加break;,输出为?查看练习答案与解析
答案:
a=1, b=0
- 如下程序:
main()
{
int i, j;
for(i=0, j=1; i<=j+1; i+=2, j--)
printf("%d\n", i);
}2
3
4
5
6
以上循环体的执行次数是 ( )
- A. 3
- B. 2
- C. 1
- D. 0
查看答案与解析
答案:C
解析:
- 第一轮:
i=0, j=1,0 <= 2成立,打印0。随后i=2, j=0。 - 第二轮:判定
2 <= 1不成立。跳出。
难度: ⭐⭐
考点: #for循环
💡 学习锦囊
思路分析
手动追踪控制变量的数值变化。
🔄 举一反三
- 修改条件为
i < j,循环几次?查看练习答案与解析
答案:1次
- 设有数组定义:
char array[]="China";则数组array所占的空间为 ( )- A. 4 个字节
- B. 5 个字节
- C. 6 个字节
- D. 7 个字节
查看答案与解析
答案:C
解析: 字符串字面量隐含结尾空字符 '\0',共计 6 字节。
难度: ⭐
考点: #字符串常量 #数组占用
💡 学习锦囊
📖 相关公式与知识点:
sizeof("China")结果为 6。
🔄 举一反三
char s[10] = "abc"; sizeof(s)为?查看练习答案与解析
答案:10
- C 语言的编译系统对宏命令是 ( )
- A. 在程序运行时进行代换处理的
- B. 在程序连接时进行代换处理的
- C. 和源程序中其它 C 语句同时进行编译的
- D. 在对源程序中其它成份正式编译之前进行处理的
查看答案与解析
答案:D
解析: 宏定义展开发生在预处理阶段,此时尚未进行词法和语法分析。
难度: ⭐
考点: #预处理 #宏替换
💡 学习锦囊
思路分析
按编译体系的先后顺序理解“预处理”。
🔄 举一反三
#include发生在什么阶段?查看练习答案与解析
答案:预处理阶段
- 以下说法中正确的是 ( )
- A. C 语言程序总是从第一个定义的函数开始执行
- B. 在 C 语言程序中,要调用的函数必须在 main() 中有定义
- C. C 语言程序的执行既可以采用解释方式,也可以采用编译方式
- D. C 语言程序中的 main() 函数可以不放在程序的开始部分
查看答案与解析
答案:D
解析:main() 函数的声明位置不限,编译时均能被正确定位。
难度: ⭐
考点: #C程序入口
💡 学习锦囊
📖 相关公式与知识点:
main()是程序的唯一执行入口。
🔄 举一反三
- 是否可以定义多个
main()函数?查看练习答案与解析
答案:不可以。
- 下面程序的输出是 ( )
#define SUB(X,Y) (X)*Y
main()
{
int a = 3, b = 4;
printf("%d\n", SUB(a++, b++));
}2
3
4
5
6
- A. 12
- B. 15
- C. 16
- D. 20
查看答案与解析
答案:A
解析: 宏替换后得到表达式 (a++) * b++。计算时使用旧值,因此为 3 * 4 = 12。
难度: ⭐⭐⭐
考点: #宏替换副作用
💡 学习锦囊
易错点
不要像函数一样提前计算参数值。
🔄 举一反三
- 若
#define SQ(x) x*x,SQ(2+3)的值为?查看练习答案与解析
答案:11 解析:
2+3*2+3 = 11。
- 设有如下定义:
char *aa[2] = {"abcd", "ABCD"};则以下说法中正确的是 ( )
- A. aa 数组元素的值分别是“abcd”,"ABCD”
- B. aa 是指针变量,它指向含有两个数组元素的字符型一维数组
- C. aa 数组的两个元素分别存放的是含有 4 个字符的一维字符数组的首地址
- D. aa 数组的两个元素中各自存放了字符‘a’,‘A'的地址
查看答案与解析
答案:D
解析: 指针数组 aa 存储的是字符串的首字符物理地址。
难度: ⭐⭐⭐
考点: #指针数组
💡 学习锦囊
📖 相关公式与知识点:
char *aa[n]代表数组;char (*p)[n]代表指针。
🔄 举一反三
sizeof(aa)的值是?(假设指针占 8 字节)查看练习答案与解析
答案:16 解析:包含 2 个指针。
- 若变量已正确说明为 float 类型,要通过语句
scanf("%f%f%f",&a,&b,&c);给 a 赋予 10.0,b 赋予 22.0,c 赋予 33.0,不正确的输入形式是 ( )
- A. 10<回车> 22<回车> 33<回车>
- B. 10.0,22.0,33.0<回车>
- C. 10.0 22.0 33.0<回车>
- D. 10 22.0 33.0<回车>
查看答案与解析
答案:B
解析:scanf 的匹配格式中不含逗号,输入带有逗号会导致解析异常。
难度: ⭐
考点: #scanf匹配
💡 学习锦囊
思路分析
严格按照参数的字面指示格式敲入。
🔄 举一反三
- 若为
scanf("%d,%d", &a, &b),如何输入?查看练习答案与解析
答案:
1,2(中间必须有逗号)。
- 当调用函数时,实参是一个数组名,则向函数传送的是 ( )
- A. 数组的长度
- B. 数组的首地址
- C. 数组每一个元素的地址
- D. 数组每个元素中的值
查看答案与解析
答案:B
解析: 在传参时数组名会自动退化为首地址指针。
难度: ⭐
考点: #实参传递
💡 学习锦囊
📖 相关公式与知识点:
- 传递数组并不会产生额外的内存元素拷贝。
🔄 举一反三
- 在函数内部修改形参数组的内容,会影响原数组吗?
查看练习答案与解析
答案:会
- 有以下函数:
char *fun(char *p)
{
return p;
}2
3
4
该函数的返回值是 ( )
- A. 无确切的值
- B. 形参 p 中存放的地址值
- C. 一个临时存储单元的地址
- D. 形参 p 自身的地址值
查看答案与解析
答案:B
解析: 返回的是 p 中本身存储的内容,即某个字符的地址值。
难度: ⭐⭐
考点: #指针函数
💡 学习锦囊
易错点
区分 p 与 &p 的区别。
🔄 举一反三
- 可以返回函数内的局部非静态数组名吗?
查看练习答案与解析
答案:不可以(悬空指针)。
- 若有以下的定义:
int t[3][2];能正确表示t数组元素地址的表达式是 ( )
- A.
&t[3][2] - B.
t[3][2] - C.
t[1][0] - D.
t[2] + 1
查看答案与解析
答案:D
解析:t[2] 指代第三行行首。t[2] + 1 则是第三行第二列元素的地址。
难度: ⭐⭐⭐
考点: #二维数组偏移
💡 学习锦囊
📖 相关公式与知识点:
t[i]+j与&t[i][j]等效。
🔄 举一反三
t[1]的本质是什么?查看练习答案与解析
答案:第二行首元素地址(
&t[1][0])。
- 以下程序的输出结果是 ( )
main()
{
int i;
for(i=1; i<6; i++)
{
if(i%2)
{
printf("#");
continue;
}
printf("*");
}
printf("\n");
}2
3
4
5
6
7
8
9
10
11
12
13
14
- A. ###
- B. #####
- C. ****
- D. ****
查看答案与解析
答案:A
解析: 当 i=1,3,5 时模除成立,打印 # 跳过。i=2,4 时打印 *。
难度: ⭐
考点: #continue
💡 学习锦囊
思路分析
注意 continue 对循环控制逻辑的分隔。
🔄 举一反三
- 若用
break代替continue,输出是?查看练习答案与解析
答案:
#
- 已知有声明语句
char s1[10] = "abcde", s3[10];以下语句中能将s1中存储的字符串和s2中存储的字符串正确交换的是 ( )
- A.
s3 = s1, s1 = s2, s2 = s3; - B.
s3[0] = s1[0], s1[0] = s2[0], s2[0] = s3[0]; - C.
strcpy(s3[0], s1[0]), strcpy(s1[0], s2[0]), strcpy(s2[0], s3[0]); - D.
strcpy(s3, s1), strcpy(s1, s2), strcpy(s2, s3);
查看答案与解析
答案:D
解析: 字符数组之间不能通过 = 直接赋值,必须依靠 strcpy 进行内容搬移。
难度: ⭐⭐
考点: #strcpy应用
💡 学习锦囊
📖 相关公式与知识点:
strcpy(dest, src)函数原型。
🔄 举一反三
- 使用哪个函数可以安全地限定复制的字符个数?
查看练习答案与解析
答案:
strncpy
- 若有声明语句
int a[10], b[3][3];则以下对数组元素赋值的操作中,不会出现越界访问的是 ( )
- A.
a[-1] = 1 - B.
a[10] = 0 - C.
b[3][0] = 0 - D.
b[0][0] = 0
查看答案与解析
答案:D
解析: C 语言中 $N$ 个元素的数组,下标上限为 $N-1$。
难度: ⭐
考点: #数组范围越界
💡 学习锦囊
易错点
注意不要误将长度当作最大下标。
🔄 举一反三
b包含几个整型元素?查看练习答案与解析
答案:9
- 以下是一个自定义函数的头部,其中正确的是 ( )
- A.
int fun(int a[], b) - B.
int fun(int a[], int a) - C.
int fun(int *a, int b) - D.
int fun(char a[][], int b)
查看答案与解析
答案:C
解析: 形参表内每个参数均需指定类型,多维数组的低维必须标注大小。
难度: ⭐⭐
考点: #函数声明
💡 学习锦囊
📖 相关公式与知识点:
- 多维数组传参,
int a[][3]合法。
🔄 举一反三
int a[3][4]作形参可表示为?查看练习答案与解析
答案:
int a[][4]或int (*a)[4]
- 下列 4 个函数中,( )能实现交换变量值的功能。
- A.
void fun(int x, int y) { int t; t=x; x=y; y=t; } - B.
void fun(int *x, int *y) { int *t; *t=*x; *x=*y; *y=*t; } - C.
void fun(int *x, int *y) { int t; t=*x; *x=*y; *y=t; } - D.
void fun(int *x, int *y) { int *t; t=x; x=y; y=t; }
查看答案与解析
答案:C
解析: 只有通过传入指针进行解引用赋值,才能打破局部作用域的限制。
难度: ⭐⭐⭐
考点: #地址传递应用
💡 学习锦囊
思路分析
掌握“传入地址、内部解引用”的基本交互原则。
🔄 举一反三
- 为什么 A 选项不能生效?
查看练习答案与解析
答案:因为它只改变了函数的局部形参副本。
二、填空题(本大题共 8 小题,共 26 分)
- 已知:
int x = 3;则:
printf(x%2 ? "**%d" : "##%d\n", x);
printf("00000\n");2
输出结果为:______
查看答案与解析
答案: **300000
解析:x%2 为 1(真),选择 "**%d" 格式串,输出 **3。第二个 printf 输出 00000\n。由于第一个 printf 没有 \n,两行连在一起显示为 **300000。
难度: ⭐⭐ 考点: #三目运算符 #printf格式
💡 学习锦囊
📖 相关公式与知识点:
- 三目运算符:
条件 ? 表达式1 : 表达式2。 - printf 不会自动换行,需手动加
\n。
思路分析
先判断条件真假,再确定使用哪个格式串。
🔄 举一反三
- 若
x=4,输出结果是什么?查看练习答案与解析
答案:
##4\n00000(##4换行后00000) 解析:4%2=0,选择"##%d\n",先输出##4并换行,再输出00000。
- 若有以下定义和语句,则通过指针
p对值为 8 的数组元素的引用表达式是:
int a[10]={1,2,3,4,5,6,7,8,9}, *p;
p = &a[1];2
查看答案与解析
答案: *(p + 6) 或 p[6]
解析:p 指向 a[1](值为2),值为8的元素是 a[7]。p 到 a[7] 的偏移量为 7 - 1 = 6,所以 *(p+6) 或 p[6] 即为 a[7]。
难度: ⭐⭐ 考点: #指针偏移 #数组下标
💡 学习锦囊
📖 相关公式与知识点:
*(p + n)等价于p[n],等价于a[起始下标 + n]。
思路分析
先确定目标元素的下标,再计算指针偏移量。
🔄 举一反三
- 若
p = a(指向首元素),引用值为 5 的表达式是?查看练习答案与解析
答案:
*(p + 4)或p[4]解析:值为5的元素是a[4],偏移量为 4。
- 下列程序的输出结果是 ______
#include "stdio.h"
main()
{
char a[11] = "0123456789", *p;
p = &a[4];
puts(p);
}2
3
4
5
6
7
查看答案与解析
答案: 456789
解析:p 指向 a[4](字符 '4'),puts(p) 从该地址开始输出直到遇到 \0,即输出 456789。
难度: ⭐ 考点: #puts函数 #指针与字符串
💡 学习锦囊
📖 相关公式与知识点:
puts(str)输出字符串并自动换行。- 字符串指针指向中间字符时,从该位置开始输出。
思路分析
puts 从指针当前位置开始,直到 \0 结束。
🔄 举一反三
- 若
p = &a[0],输出是什么?查看练习答案与解析
答案:
0123456789解析:从首字符开始输出整个字符串。
- 求两数中的较大值,补全程序:
main()
{
float a, b, max;
scanf("%f%f", &a, &b);
max = ______________;
printf("the max is %f\n", max);
}2
3
4
5
6
7
查看答案与解析
答案: a > b ? a : b
解析: 三目运算符 a > b ? a : b 表示:若 a > b 成立则取 a,否则取 b。
难度: ⭐ 考点: #三目运算符
💡 学习锦囊
📖 相关公式与知识点:
max = (a > b) ? a : b;等价于if(a > b) max = a; else max = b;。
思路分析
三目运算符是 if-else 的简洁表达。
🔄 举一反三
- 用三目运算符求三个数中的最大值。
查看练习答案与解析
答案:
max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);解析:嵌套三目运算符,先比较 a 和 b,再与 c 比较。
- 下列程序用于将从键盘输入的正整数逆序输出,请填空。
main()
{
int n1, n2;
scanf("%d", &n2);
while( ________ )
{
n1 = n2 % 10;
n2 = ________;
printf("%d", n1);
}
}2
3
4
5
6
7
8
9
10
11
查看答案与解析
答案: n2 != 0;n2 / 10
解析: 每次取 n2 的个位(n2 % 10)输出,然后去掉个位(n2 / 10)。当 n2 变为 0 时循环结束。
难度: ⭐⭐ 考点: #数字逆序 #循环控制
💡 学习锦囊
📖 相关公式与知识点:
- 取个位:
n % 10 - 去个位:
n / 10(整数除法)
思路分析
逆序输出的核心是反复"取个位→去个位"。
🔄 举一反三
- 输入
123,输出是什么?查看练习答案与解析
答案:
321解析:第一次取3去12,第二次取2去1,第三次取1去0,循环结束。
- 下面的程序输出 3 到 1000 之间的所有素数,且每 5 个一行。请填空。
main()
{
int i, j;
int b = 0, c = 0;
for(i=3; i<=1000; i++)
{
b = 0; // 必须在此处重置状态标志,防止状态残留导致算法失效
for(j=2; j<=i-1; j++)
if( ________ ) { b=1; break; }
if(!b)
{
c++;
printf("%4d", i);
if( ________ ) printf("\n");
}
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查看答案与解析
答案: i % j == 0;c % 5 == 0
解析: 第一空:若 i 能被 j 整除,则 i 不是素数,设标志 b=1 并跳出。 第二空:c 记录已输出的素数个数,每满 5 个换行。
难度: ⭐⭐⭐ 考点: #素数判断 #格式化输出
💡 学习锦囊
📖 相关公式与知识点:
- 素数:大于1,只能被1和自身整除。
%运算符用于判断整除。
思路分析
用标志变量 b 记录是否找到因子,循环结束后根据 b 判断。
🔄 举一反三
- 如何优化素数判断的循环上限?
查看练习答案与解析
答案:
j <= sqrt(i)或j <= i/2解析:若i有因子,必有一个 ≤ √i。
- 利用插入排序法将十个字符从小到大排序。请填空。
void insert(char s[])
{
int i, j, t;
for (i = 1; i <= 9; i++)
{
t = s[i];
j = i - 1;
while (j >= 0 && ________)
{
s[j+1] = s[j];
________;
}
s[j+1] = t;
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
查看答案与解析
答案: s[j] > t;j--
解析: 插入排序:将当前元素 t 与前面已排序的元素从后往前比较,若前面的元素更大则后移,直到找到合适位置插入。
难度: ⭐⭐⭐ 考点: #插入排序 #字符比较
💡 学习锦囊
📖 相关公式与知识点:
- 插入排序思想:将未排序元素逐个插入已排序序列的正确位置。
- 字符比较可直接用
>、<(比较 ASCII 码)。
思路分析
内层 while 循环负责将比 t 大的元素后移,为 t 腾出位置。
🔄 举一反三
- 若改为从大到小排序,条件应如何修改?
查看练习答案与解析
答案:
s[j] < t解析:当已排序元素小于当前元素时后移,实现降序。
- 用递归法将一个整数
n转换成字符串。请填空。
void convert(int n)
{
if((n/10) != 0)
convert(________);
putchar(n%10 + '0');
}2
3
4
5
6
查看答案与解析
答案: n / 10
解析: 递归思想:先递归处理高位(n/10),再输出当前个位。这样能保证高位先输出,实现正序转换。
难度: ⭐⭐⭐ 考点: #递归 #数字转字符
💡 学习锦囊
📖 相关公式与知识点:
- 数字转字符:
n % 10 + '0'。 - 递归三要素:终止条件、递归调用、回溯处理。
思路分析
递归调用在输出之前,保证先处理高位再输出低位。
🔄 举一反三
- 若将
putchar放在递归调用之前,输出是什么顺序?查看练习答案与解析
答案:逆序(个位先输出) 解析:先输出再递归 = 先低位后高位 = 逆序。
三、判断题(本大题共 10 小题,每小题 2 分,共 20 分)
- 在对某一函数进行多次调用时,系统会对相应的自动变量重新分配存储单元。 ( )
查看答案与解析
答案:正确解析: 自动变量的生命周期仅存在于该次调用的栈帧中。
难度: ⭐
考点: #自动变量作用域
💡 学习锦囊
📖 相关公式与知识点:
- 自动变量(auto):每次函数调用时分配,函数返回时释放。
- 静态变量(static):只分配一次,贯穿整个程序生命周期。
思路分析
区分自动变量和静态变量的存储分配机制。
🔄 举一反三
- 静态变量分配几次?(答:1次)
- 在 C 语言的复合语句中,只能包含可执行语句。 ( )
查看答案与解析
答案:错误解析: 在花括号内完全可以声明新的临时局部变量。
难度: ⭐
考点: #复合语句范围
💡 学习锦囊
📖 相关公式与知识点:
- 复合语句(
{ })可以包含声明和语句。 - 在复合语句中声明的变量,作用域仅限于该复合语句内。
思路分析
复合语句 = 声明部分 + 语句部分,不仅仅是可执行语句。
🔄 举一反三
- 在复合语句中定义的变量,在复合语句外能访问吗?
查看练习答案与解析
答案:不能 解析:作用域仅限于定义它的
{}内部。
- 自动变量属于局部变量。 ( )
查看答案与解析
答案:正确解析: 默认声明在内部的普通变量即是 auto。
难度: ⭐
考点: #变量分类
💡 学习锦囊
📖 相关公式与知识点:
- 局部变量:在函数或复合语句内部定义的变量。
- 自动变量(auto)是局部变量的默认存储类别。
思路分析
局部变量默认就是 auto,所以自动变量一定是局部变量。
🔄 举一反三
- 全局变量可以是自动变量吗?
查看练习答案与解析
答案:不可以 解析:全局变量默认是静态存储类别(extern/static),不能是 auto。
- 一个函数利用 return 只能返回一个函数值。 ( )
查看答案与解析
答案:正确解析: 只能携带单项基本数据载荷。
难度: ⭐
考点: #函数返回值
💡 学习锦囊
📖 相关公式与知识点:
- return 语句只能返回一个值。
- 如需返回多个值,可使用指针参数或结构体。
思路分析
return 的本质是将一个值放入寄存器或栈中返回给调用者。
🔄 举一反三
- 如何让函数"返回"多个值?
查看练习答案与解析
答案:通过指针参数将结果写入调用者的变量中。 解析:如
void func(int *a, int *b)可修改两个值。
- 在程序运行过程中,系统分配给实参和形参的内存单元是不同的。 ( )
查看答案与解析
答案:正确解析: 它们是两个独立占据内存栈空间的变量。
难度: ⭐
考点: #栈拷贝
💡 学习锦囊
📖 相关公式与知识点:
- C 语言参数传递是"值传递":形参是实参的副本。
- 修改形参不会影响实参(除非传递指针)。
思路分析
实参和形参各自拥有独立的内存空间。
🔄 举一反三
- 若实参是数组名,形参和实参指向同一块内存吗?
查看练习答案与解析
答案:是(指向同一数组首地址) 解析:数组名传递的是地址,形参和实参指向同一数组。
- 用 scanf 输入字符串时,字符串中不能包含空格。 ( )
查看答案与解析
答案:正确解析: 空格字符会直接判定为流提取的终止信号。
难度: ⭐
考点: #scanf读取
💡 学习锦囊
📖 相关公式与知识点:
scanf("%s", str)以空白字符(空格、Tab、换行)作为分隔符。- 如需读取含空格的字符串,使用
gets()或scanf("%[^\n]", str)。
思路分析
scanf 的 %s 格式遇到空格就停止读取。
🔄 举一反三
- 如何用 scanf 读取含空格的整行?
查看练习答案与解析
答案:
scanf("%[^\n]", str);解析:[^\n]表示读取除换行符外的所有字符。
- Continue 和 break 都可用来实现循环体的中止。 ( )
查看答案与解析
答案:错误解析: continue 跳步,break 终结。
难度: ⭐
考点: #跳转指令
💡 学习锦囊
📖 相关公式与知识点:
break:终止整个循环,跳出循环体。continue:跳过本次循环剩余语句,进入下一次迭代。
思路分析
continue 不是"中止"循环,而是"跳过"本次迭代。
🔄 举一反三
- 在 switch 语句中,continue 和 break 哪个有效?
查看练习答案与解析
答案:break 有效,continue 无效(switch 不是循环) 解析:continue 只能用于循环体中。
- 若将 C 源程序经过编译、连接后生成可执行文件,则可直接在操作系统终端下输入可执行文件名执行。 ( )
查看答案与解析
答案:正确解析: 可执行机器码已完成环境绑定。
难度: ⭐
考点: #生成流程
💡 学习锦囊
📖 相关公式与知识点:
- C 程序生成流程:编辑 → 预处理 → 编译 → 汇编 → 链接 → 可执行文件。
- 可执行文件包含机器码,可直接在操作系统上运行。
思路分析
编译链接后的 .exe 文件是独立的可执行程序。
🔄 举一反三
- 源程序 .c 文件可以直接执行吗?
查看练习答案与解析
答案:不可以 解析:.c 是文本文件,需要编译链接后才能执行。
- 字符常量的长度肯定为 1。 ( )
查看答案与解析
答案:正确解析: 在字面语义上它等同于占用一字节。
难度: ⭐
考点: #字符定义
💡 学习锦囊
📖 相关公式与知识点:
- 字符常量用单引号括起,如
'A'、'\n'。 - 转义字符虽然写成多个字符,但只代表一个字符。
思路分析
无论普通字符还是转义字符,字符常量始终代表一个字符。
🔄 举一反三
'ab'是合法的字符常量吗?查看练习答案与解析
答案:语法上合法但行为由实现定义 解析:多字符常量是未定义行为,应避免使用。
- 已知:
char c=48; int i=1, j=10;执行语句j = !(c > j) && i++;则i和j的值分别是 1 和 0。 ( )
查看答案与解析
答案:正确解析: 第一项的 0 触发了逻辑捷径,阻止了后续 i 发生溢出递增。
难度: ⭐⭐
考点: #短路捷径机制
💡 学习锦囊
📖 相关公式与知识点:
- 短路求值:
&&左侧为假时不再计算右侧;||左侧为真时不再计算右侧。 !逻辑非:非0变0,0变1。
思路分析
先计算 !(c > j),若为假则整个 && 短路。
🔄 举一反三
- 若
c=50,执行后i和j的值分别是多少?查看练习答案与解析
答案:
i=1, j=0解析:c=50, j=10,c>j为真(1),!(1)=0,短路,i++不执行,j=0。
四、编程题(本题共 1 题,共 14 分)
编写程序,从键盘输入正整数 $n$ 的值,求 $1! + 2! + \dots + n!$ 的值。要求用函数实现阶乘的计算,并通过函数值返回。
查看答案与解析
代码实现:
#include <stdio.h>
// 阶乘计算函数
long long factorial(int n)
{
long long fact = 1;
for(int i = 1; i <= n; i++)
{
fact *= i;
}
return fact;
}
int main()
{
int n;
long long sum = 0;
printf("请输入 n 的值: ");
if(scanf("%d", &n) != 1 || n < 1)
{
printf("输入无效!\n");
return 1;
}
for(int i = 1; i <= n; i++)
{
sum += factorial(i);
}
printf("1! + 2! + ... + %d! = %lld\n", n, sum);
return 0;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
难度: ⭐⭐
考点: #阶乘逻辑 #循环嵌套处理
💡 学习锦囊
📖 相关公式与知识点:
- 阶乘定义:$n! = 1 \times 2 \times \dots \times n$
- 累加求和:使用循环逐个累加。
思路分析
将阶乘计算封装为函数,主函数负责循环调用并累加。
易错点
注意阶乘结果可能很大,应使用 long long 类型防止溢出。
🔄 举一反三
- 修改程序,求 $1! + 3! + 5! + \dots + (2n-1)!$(奇数项阶乘之和)。
查看练习答案与解析
答案:将循环改为
for(int i=1; i<=n; i+=2)或for(int i=1; i<=2*n-1; i+=2)。 解析:步长改为2,只累加奇数项。