Skip to content

《C语言程序设计》第二学期重修试卷B (精选04)

一、选择题(本大题共20小题,每小题2分,共40分)

  1. 设有说明语句: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 拆开计算为 \72 三个字符。
  • 混淆转义字符的字面长度与实际代表的字符个数。
🔄 举一反三
  1. 字符常量 '\x2A' 包含几个字符?
    查看练习答案与解析

    答案:1个 解析\x2A 是十六进制转义字符,代表一个字符(十进制 42,对应 ASCII 码中的 *)。

  2. 字符串 "\\72" 包含几个字符(不含结束符)?
    查看练习答案与解析

    答案:3个 解析\\ 是转义的反斜杠本身(1个字符),7 是普通字符(1个),2 是普通字符(1个),共 3 个字符。

  1. 在 C 语言中,数字 029 是一个 ( )
    • A. 八进制数
    • B. 十六进制数
    • C. 十进制数
    • D. 非法数
查看答案与解析

答案:D

解析:

  • C 语言中以数字 0 开头的整型常量代表八进制数。
  • 八进制数的数码范围是 0~7
  • 数字 029 包含了数码 9,这超出了八进制的数码范围,因此是一个非法数。

难度: ⭐
考点: #数制表示 #八进制

💡 学习锦囊

📖 相关公式与知识点:

  • 八进制常量:以 0 开头,如 012

思路分析

检查后续每一位数字是否都在 0~7 的范围内。

🔄 举一反三
  1. 下列常量中,不合法的十六进制数是 ( )
    • A. 0x12
    • B. 0xFG
    • C. 0XABC
    查看练习答案与解析

    答案:B 解析:十六进制的有效字符为 0-9A-F

  1. 有如下程序:
c
main()  
{
    int y=3, x=3, z=1;
    printf("%d%d\n", (++x, y++), z+2);
}

运行该程序的输出结果是 ( )

  • A. 34
  • B. 42
  • C. 43
  • D. 33
查看答案与解析

答案:D

解析:

  1. 逗号表达式 (++x, y++) 的求值顺序是从左到右,整个表达式的值是最后一个子表达式的值。首先执行 ++xx 变为 4。随后执行 y++。后缀自增返回 y 当前的值 3
  2. 第二个打印项 z+2 值为 3

难度: ⭐⭐
考点: #逗号表达式 #自增运算符

💡 学习锦囊

📖 相关公式与知识点:

  • 逗号表达式:(表达式1, 表达式2, ..., 表达式n) 的值等于 表达式n 的值。
🔄 举一反三
  1. 执行语句 int a=1, b=2, c; c = (a++, ++b); 后,c 的值是多少?
    查看练习答案与解析

    答案:3 解析:逗号表达式取最后一项的值。

  1. 有如下程序段:
c
int a=14, b=15, x;  
char c='A';  
x = (a && b) && (c < 'B');

执行该程序段后,x 的值为 ( )

  • A. true
  • B. false
  • C. 0
  • D. 1
查看答案与解析

答案:D

解析:a && b 得 1(真);c < 'B'(即 'A' < 'B')得 1(真)。1 && 1 的结果为 1。


难度: ⭐
考点: #逻辑运算符 #关系运算符

💡 学习锦囊

📖 相关公式与知识点:

  • C 语言传统的逻辑真用整数 1 表示。
🔄 举一反三
  1. 表达式 3 > 2 || 1 && 0 的结果是?
    查看练习答案与解析

    答案:1 解析&& 的优先级高于 ||

  1. 如下程序:
c
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); 
}

该程序的输出结果是 ( )

  • 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 1case 2a 自增两次变为 2,b 自增一次变为 1。


难度: ⭐⭐
考点: #switch语句 #case穿透

💡 学习锦囊

📖 相关公式与知识点:

  • 只有遇到 break 才会跳出 switch
🔄 举一反三
  1. 若在 case 1 后加 break;,输出为?
    查看练习答案与解析

    答案a=1, b=0

  1. 如下程序:
c
main()
{
    int i, j;  
    for(i=0, j=1; i<=j+1; i+=2, j--) 
        printf("%d\n", i);  
}

以上循环体的执行次数是 ( )

  • A. 3
  • B. 2
  • C. 1
  • D. 0
查看答案与解析

答案:C

解析:

  • 第一轮:i=0, j=10 <= 2 成立,打印 0。随后 i=2, j=0
  • 第二轮:判定 2 <= 1 不成立。跳出。

难度: ⭐⭐
考点: #for循环

💡 学习锦囊

思路分析

手动追踪控制变量的数值变化。

🔄 举一反三
  1. 修改条件为 i < j,循环几次?
    查看练习答案与解析

    答案:1次

  1. 设有数组定义:char array[]="China"; 则数组 array 所占的空间为 ( )
    • A. 4 个字节
    • B. 5 个字节
    • C. 6 个字节
    • D. 7 个字节
查看答案与解析

答案:C

解析: 字符串字面量隐含结尾空字符 '\0',共计 6 字节。


难度: ⭐
考点: #字符串常量 #数组占用

💡 学习锦囊

📖 相关公式与知识点:

  • sizeof("China") 结果为 6。
🔄 举一反三
  1. char s[10] = "abc"; sizeof(s) 为?
    查看练习答案与解析

    答案:10

  1. C 语言的编译系统对宏命令是 ( )
    • A. 在程序运行时进行代换处理的
    • B. 在程序连接时进行代换处理的
    • C. 和源程序中其它 C 语句同时进行编译的
    • D. 在对源程序中其它成份正式编译之前进行处理的
查看答案与解析

答案:D

解析: 宏定义展开发生在预处理阶段,此时尚未进行词法和语法分析。


难度: ⭐
考点: #预处理 #宏替换

💡 学习锦囊

思路分析

按编译体系的先后顺序理解“预处理”。

🔄 举一反三
  1. #include 发生在什么阶段?
    查看练习答案与解析

    答案:预处理阶段

  1. 以下说法中正确的是 ( )
    • A. C 语言程序总是从第一个定义的函数开始执行
    • B. 在 C 语言程序中,要调用的函数必须在 main() 中有定义
    • C. C 语言程序的执行既可以采用解释方式,也可以采用编译方式
    • D. C 语言程序中的 main() 函数可以不放在程序的开始部分
查看答案与解析

答案:D

解析:main() 函数的声明位置不限,编译时均能被正确定位。


难度: ⭐
考点: #C程序入口

💡 学习锦囊

📖 相关公式与知识点:

  • main() 是程序的唯一执行入口。
🔄 举一反三
  1. 是否可以定义多个 main() 函数?
    查看练习答案与解析

    答案:不可以。

  1. 下面程序的输出是 ( )
c
#define SUB(X,Y) (X)*Y
main()  
{
    int a = 3, b = 4; 
    printf("%d\n", SUB(a++, b++));
}
  • A. 12
  • B. 15
  • C. 16
  • D. 20
查看答案与解析

答案:A

解析: 宏替换后得到表达式 (a++) * b++。计算时使用旧值,因此为 3 * 4 = 12


难度: ⭐⭐⭐
考点: #宏替换副作用

💡 学习锦囊

易错点

不要像函数一样提前计算参数值。

🔄 举一反三
  1. #define SQ(x) x*xSQ(2+3) 的值为?
    查看练习答案与解析

    答案:11 解析2+3*2+3 = 11

  1. 设有如下定义:
c
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] 代表指针。
🔄 举一反三
  1. sizeof(aa) 的值是?(假设指针占 8 字节)
    查看练习答案与解析

    答案:16 解析:包含 2 个指针。

  1. 若变量已正确说明为 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匹配

💡 学习锦囊

思路分析

严格按照参数的字面指示格式敲入。

🔄 举一反三
  1. 若为 scanf("%d,%d", &a, &b),如何输入?
    查看练习答案与解析

    答案1,2(中间必须有逗号)。

  1. 当调用函数时,实参是一个数组名,则向函数传送的是 ( )
  • A. 数组的长度
  • B. 数组的首地址
  • C. 数组每一个元素的地址
  • D. 数组每个元素中的值
查看答案与解析

答案:B

解析: 在传参时数组名会自动退化为首地址指针。


难度: ⭐
考点: #实参传递

💡 学习锦囊

📖 相关公式与知识点:

  • 传递数组并不会产生额外的内存元素拷贝。
🔄 举一反三
  1. 在函数内部修改形参数组的内容,会影响原数组吗?
    查看练习答案与解析

    答案:会

  1. 有以下函数:
c
char *fun(char *p)  
{ 
    return p; 
}

该函数的返回值是 ( )

  • A. 无确切的值
  • B. 形参 p 中存放的地址值
  • C. 一个临时存储单元的地址
  • D. 形参 p 自身的地址值
查看答案与解析

答案:B

解析: 返回的是 p 中本身存储的内容,即某个字符的地址值。


难度: ⭐⭐
考点: #指针函数

💡 学习锦囊

易错点

区分 p&p 的区别。

🔄 举一反三
  1. 可以返回函数内的局部非静态数组名吗?
    查看练习答案与解析

    答案:不可以(悬空指针)。

  1. 若有以下的定义: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] 等效。
🔄 举一反三
  1. t[1] 的本质是什么?
    查看练习答案与解析

    答案:第二行首元素地址(&t[1][0])。

  1. 以下程序的输出结果是 ( )
c
main() 
{ 
    int i; 
    for(i=1; i<6; i++) 
    { 
        if(i%2) 
        {
            printf("#"); 
            continue; 
        } 
        printf("*"); 
    } 
    printf("\n"); 
}
  • A. ###
  • B. #####
  • C. ****
  • D. ****
查看答案与解析

答案:A

解析:i=1,3,5 时模除成立,打印 # 跳过。i=2,4 时打印 *


难度: ⭐
考点: #continue

💡 学习锦囊

思路分析

注意 continue 对循环控制逻辑的分隔。

🔄 举一反三
  1. 若用 break 代替 continue,输出是?
    查看练习答案与解析

    答案#

  1. 已知有声明语句 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) 函数原型。
🔄 举一反三
  1. 使用哪个函数可以安全地限定复制的字符个数?
    查看练习答案与解析

    答案strncpy

  1. 若有声明语句 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$


难度: ⭐
考点: #数组范围越界

💡 学习锦囊

易错点

注意不要误将长度当作最大下标。

🔄 举一反三
  1. b 包含几个整型元素?
    查看练习答案与解析

    答案:9

  1. 以下是一个自定义函数的头部,其中正确的是 ( )
  • 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] 合法。
🔄 举一反三
  1. int a[3][4] 作形参可表示为?
    查看练习答案与解析

    答案int a[][4]int (*a)[4]

  1. 下列 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

解析: 只有通过传入指针进行解引用赋值,才能打破局部作用域的限制。


难度: ⭐⭐⭐
考点: #地址传递应用

💡 学习锦囊

思路分析

掌握“传入地址、内部解引用”的基本交互原则。

🔄 举一反三
  1. 为什么 A 选项不能生效?
    查看练习答案与解析

    答案:因为它只改变了函数的局部形参副本。


二、填空题(本大题共 8 小题,共 26 分)

  1. 已知:int x = 3; 则:
c
printf(x%2 ? "**%d" : "##%d\n", x); 
printf("00000\n");

输出结果为:______

查看答案与解析

答案: **300000

解析:x%2 为 1(真),选择 "**%d" 格式串,输出 **3。第二个 printf 输出 00000\n。由于第一个 printf 没有 \n,两行连在一起显示为 **300000


难度: ⭐⭐ 考点: #三目运算符 #printf格式

💡 学习锦囊

📖 相关公式与知识点:

  • 三目运算符:条件 ? 表达式1 : 表达式2
  • printf 不会自动换行,需手动加 \n

思路分析

先判断条件真假,再确定使用哪个格式串。

🔄 举一反三
  1. x=4,输出结果是什么?
    查看练习答案与解析

    答案##4\n00000##4 换行后 00000解析4%2=0,选择 "##%d\n",先输出 ##4 并换行,再输出 00000

  1. 若有以下定义和语句,则通过指针 p 对值为 8 的数组元素的引用表达式是:
c
int a[10]={1,2,3,4,5,6,7,8,9}, *p; 
p = &a[1];

查看答案与解析

答案: *(p + 6)p[6]

解析:p 指向 a[1](值为2),值为8的元素是 a[7]pa[7] 的偏移量为 7 - 1 = 6,所以 *(p+6)p[6] 即为 a[7]


难度: ⭐⭐ 考点: #指针偏移 #数组下标

💡 学习锦囊

📖 相关公式与知识点:

  • *(p + n) 等价于 p[n],等价于 a[起始下标 + n]

思路分析

先确定目标元素的下标,再计算指针偏移量。

🔄 举一反三
  1. p = a(指向首元素),引用值为 5 的表达式是?
    查看练习答案与解析

    答案*(p + 4)p[4]解析:值为5的元素是 a[4],偏移量为 4。

  1. 下列程序的输出结果是 ______
c
#include "stdio.h"   
main()   
{
    char a[11] = "0123456789", *p; 
    p = &a[4];   
    puts(p);
}
查看答案与解析

答案: 456789

解析:p 指向 a[4](字符 '4'),puts(p) 从该地址开始输出直到遇到 \0,即输出 456789


难度: ⭐ 考点: #puts函数 #指针与字符串

💡 学习锦囊

📖 相关公式与知识点:

  • puts(str) 输出字符串并自动换行。
  • 字符串指针指向中间字符时,从该位置开始输出。

思路分析

puts 从指针当前位置开始,直到 \0 结束。

🔄 举一反三
  1. p = &a[0],输出是什么?
    查看练习答案与解析

    答案0123456789解析:从首字符开始输出整个字符串。

  1. 求两数中的较大值,补全程序:
c
main() 
{ 
    float a, b, max; 
    scanf("%f%f", &a, &b); 
    max = ______________;
    printf("the max is %f\n", max); 
}
查看答案与解析

答案: 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 的简洁表达。

🔄 举一反三
  1. 用三目运算符求三个数中的最大值。
    查看练习答案与解析

    答案max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);解析:嵌套三目运算符,先比较 a 和 b,再与 c 比较。

  1. 下列程序用于将从键盘输入的正整数逆序输出,请填空。
c
main() 
{
    int n1, n2; 
    scanf("%d", &n2); 
    while( ________ ) 
    { 
        n1 = n2 % 10; 
        n2 = ________; 
        printf("%d", n1); 
    } 
}
查看答案与解析

答案: n2 != 0n2 / 10

解析: 每次取 n2 的个位(n2 % 10)输出,然后去掉个位(n2 / 10)。当 n2 变为 0 时循环结束。


难度: ⭐⭐ 考点: #数字逆序 #循环控制

💡 学习锦囊

📖 相关公式与知识点:

  • 取个位:n % 10
  • 去个位:n / 10(整数除法)

思路分析

逆序输出的核心是反复"取个位→去个位"。

🔄 举一反三
  1. 输入 123,输出是什么?
    查看练习答案与解析

    答案321解析:第一次取3去12,第二次取2去1,第三次取1去0,循环结束。

  1. 下面的程序输出 3 到 1000 之间的所有素数,且每 5 个一行。请填空。
c
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");
        }  
    }  
}
查看答案与解析

答案: i % j == 0c % 5 == 0

解析: 第一空:若 i 能被 j 整除,则 i 不是素数,设标志 b=1 并跳出。 第二空:c 记录已输出的素数个数,每满 5 个换行。


难度: ⭐⭐⭐ 考点: #素数判断 #格式化输出

💡 学习锦囊

📖 相关公式与知识点:

  • 素数:大于1,只能被1和自身整除。
  • % 运算符用于判断整除。

思路分析

用标志变量 b 记录是否找到因子,循环结束后根据 b 判断。

🔄 举一反三
  1. 如何优化素数判断的循环上限?
    查看练习答案与解析

    答案j <= sqrt(i)j <= i/2解析:若 i 有因子,必有一个 ≤ √i。

  1. 利用插入排序法将十个字符从小到大排序。请填空。
c
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;
    }
}
查看答案与解析

答案: s[j] > tj--

解析: 插入排序:将当前元素 t 与前面已排序的元素从后往前比较,若前面的元素更大则后移,直到找到合适位置插入。


难度: ⭐⭐⭐ 考点: #插入排序 #字符比较

💡 学习锦囊

📖 相关公式与知识点:

  • 插入排序思想:将未排序元素逐个插入已排序序列的正确位置。
  • 字符比较可直接用 ><(比较 ASCII 码)。

思路分析

内层 while 循环负责将比 t 大的元素后移,为 t 腾出位置。

🔄 举一反三
  1. 若改为从大到小排序,条件应如何修改?
    查看练习答案与解析

    答案s[j] < t解析:当已排序元素小于当前元素时后移,实现降序。

  1. 用递归法将一个整数 n 转换成字符串。请填空。
c
void convert(int n) 
{
    if((n/10) != 0)
        convert(________);
    putchar(n%10 + '0');
}
查看答案与解析

答案: n / 10

解析: 递归思想:先递归处理高位(n/10),再输出当前个位。这样能保证高位先输出,实现正序转换。


难度: ⭐⭐⭐ 考点: #递归 #数字转字符

💡 学习锦囊

📖 相关公式与知识点:

  • 数字转字符:n % 10 + '0'
  • 递归三要素:终止条件、递归调用、回溯处理。

思路分析

递归调用在输出之前,保证先处理高位再输出低位。

🔄 举一反三
  1. 若将 putchar 放在递归调用之前,输出是什么顺序?
    查看练习答案与解析

    答案:逆序(个位先输出) 解析:先输出再递归 = 先低位后高位 = 逆序。


三、判断题(本大题共 10 小题,每小题 2 分,共 20 分)

  1. 在对某一函数进行多次调用时,系统会对相应的自动变量重新分配存储单元。 ( )
查看答案与解析

答案:正确解析: 自动变量的生命周期仅存在于该次调用的栈帧中。

难度: ⭐
考点: #自动变量作用域

💡 学习锦囊

📖 相关公式与知识点:

  • 自动变量(auto):每次函数调用时分配,函数返回时释放。
  • 静态变量(static):只分配一次,贯穿整个程序生命周期。

思路分析

区分自动变量和静态变量的存储分配机制。

🔄 举一反三
  1. 静态变量分配几次?(答:1次)
  1. 在 C 语言的复合语句中,只能包含可执行语句。 ( )
查看答案与解析

答案:错误解析: 在花括号内完全可以声明新的临时局部变量。

难度: ⭐
考点: #复合语句范围

💡 学习锦囊

📖 相关公式与知识点:

  • 复合语句({ })可以包含声明和语句。
  • 在复合语句中声明的变量,作用域仅限于该复合语句内。

思路分析

复合语句 = 声明部分 + 语句部分,不仅仅是可执行语句。

🔄 举一反三
  1. 在复合语句中定义的变量,在复合语句外能访问吗?
    查看练习答案与解析

    答案:不能 解析:作用域仅限于定义它的 {} 内部。

  1. 自动变量属于局部变量。 ( )
查看答案与解析

答案:正确解析: 默认声明在内部的普通变量即是 auto

难度: ⭐
考点: #变量分类

💡 学习锦囊

📖 相关公式与知识点:

  • 局部变量:在函数或复合语句内部定义的变量。
  • 自动变量(auto)是局部变量的默认存储类别。

思路分析

局部变量默认就是 auto,所以自动变量一定是局部变量。

🔄 举一反三
  1. 全局变量可以是自动变量吗?
    查看练习答案与解析

    答案:不可以 解析:全局变量默认是静态存储类别(extern/static),不能是 auto。

  1. 一个函数利用 return 只能返回一个函数值。 ( )
查看答案与解析

答案:正确解析: 只能携带单项基本数据载荷。

难度: ⭐
考点: #函数返回值

💡 学习锦囊

📖 相关公式与知识点:

  • return 语句只能返回一个值。
  • 如需返回多个值,可使用指针参数或结构体。

思路分析

return 的本质是将一个值放入寄存器或栈中返回给调用者。

🔄 举一反三
  1. 如何让函数"返回"多个值?
    查看练习答案与解析

    答案:通过指针参数将结果写入调用者的变量中。 解析:如 void func(int *a, int *b) 可修改两个值。

  1. 在程序运行过程中,系统分配给实参和形参的内存单元是不同的。 ( )
查看答案与解析

答案:正确解析: 它们是两个独立占据内存栈空间的变量。

难度: ⭐
考点: #栈拷贝

💡 学习锦囊

📖 相关公式与知识点:

  • C 语言参数传递是"值传递":形参是实参的副本。
  • 修改形参不会影响实参(除非传递指针)。

思路分析

实参和形参各自拥有独立的内存空间。

🔄 举一反三
  1. 若实参是数组名,形参和实参指向同一块内存吗?
    查看练习答案与解析

    答案:是(指向同一数组首地址) 解析:数组名传递的是地址,形参和实参指向同一数组。

  1. 用 scanf 输入字符串时,字符串中不能包含空格。 ( )
查看答案与解析

答案:正确解析: 空格字符会直接判定为流提取的终止信号。

难度: ⭐
考点: #scanf读取

💡 学习锦囊

📖 相关公式与知识点:

  • scanf("%s", str) 以空白字符(空格、Tab、换行)作为分隔符。
  • 如需读取含空格的字符串,使用 gets()scanf("%[^\n]", str)

思路分析

scanf 的 %s 格式遇到空格就停止读取。

🔄 举一反三
  1. 如何用 scanf 读取含空格的整行?
    查看练习答案与解析

    答案scanf("%[^\n]", str);解析[^\n] 表示读取除换行符外的所有字符。

  1. Continue 和 break 都可用来实现循环体的中止。 ( )
查看答案与解析

答案:错误解析: continue 跳步,break 终结。

难度: ⭐
考点: #跳转指令

💡 学习锦囊

📖 相关公式与知识点:

  • break:终止整个循环,跳出循环体。
  • continue:跳过本次循环剩余语句,进入下一次迭代。

思路分析

continue 不是"中止"循环,而是"跳过"本次迭代。

🔄 举一反三
  1. 在 switch 语句中,continue 和 break 哪个有效?
    查看练习答案与解析

    答案:break 有效,continue 无效(switch 不是循环) 解析:continue 只能用于循环体中。

  1. 若将 C 源程序经过编译、连接后生成可执行文件,则可直接在操作系统终端下输入可执行文件名执行。 ( )
查看答案与解析

答案:正确解析: 可执行机器码已完成环境绑定。

难度: ⭐
考点: #生成流程

💡 学习锦囊

📖 相关公式与知识点:

  • C 程序生成流程:编辑 → 预处理 → 编译 → 汇编 → 链接 → 可执行文件。
  • 可执行文件包含机器码,可直接在操作系统上运行。

思路分析

编译链接后的 .exe 文件是独立的可执行程序。

🔄 举一反三
  1. 源程序 .c 文件可以直接执行吗?
    查看练习答案与解析

    答案:不可以 解析:.c 是文本文件,需要编译链接后才能执行。

  1. 字符常量的长度肯定为 1。 ( )
查看答案与解析

答案:正确解析: 在字面语义上它等同于占用一字节。

难度: ⭐
考点: #字符定义

💡 学习锦囊

📖 相关公式与知识点:

  • 字符常量用单引号括起,如 'A''\n'
  • 转义字符虽然写成多个字符,但只代表一个字符。

思路分析

无论普通字符还是转义字符,字符常量始终代表一个字符。

🔄 举一反三
  1. 'ab' 是合法的字符常量吗?
    查看练习答案与解析

    答案:语法上合法但行为由实现定义 解析:多字符常量是未定义行为,应避免使用。

  1. 已知:char c=48; int i=1, j=10; 执行语句 j = !(c > j) && i++;ij 的值分别是 1 和 0。 ( )
查看答案与解析

答案:正确解析: 第一项的 0 触发了逻辑捷径,阻止了后续 i 发生溢出递增。

难度: ⭐⭐
考点: #短路捷径机制

💡 学习锦囊

📖 相关公式与知识点:

  • 短路求值:&& 左侧为假时不再计算右侧;|| 左侧为真时不再计算右侧。
  • ! 逻辑非:非0变0,0变1。

思路分析

先计算 !(c > j),若为假则整个 && 短路。

🔄 举一反三
  1. c=50,执行后 ij 的值分别是多少?
    查看练习答案与解析

    答案i=1, j=0解析c=50, j=10c>j 为真(1),!(1)=0,短路,i++ 不执行,j=0


四、编程题(本题共 1 题,共 14 分)

编写程序,从键盘输入正整数 $n$ 的值,求 $1! + 2! + \dots + n!$ 的值。要求用函数实现阶乘的计算,并通过函数值返回。

查看答案与解析

代码实现:

c
#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;
}

难度: ⭐⭐
考点: #阶乘逻辑 #循环嵌套处理

💡 学习锦囊

📖 相关公式与知识点:

  • 阶乘定义:$n! = 1 \times 2 \times \dots \times n$
  • 累加求和:使用循环逐个累加。

思路分析

将阶乘计算封装为函数,主函数负责循环调用并累加。

易错点

注意阶乘结果可能很大,应使用 long long 类型防止溢出。

🔄 举一反三
  1. 修改程序,求 $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,只累加奇数项。

你正在阅读的是会员专属文档,💕 限时特惠进行中
你尚未登录,目前新用户可获3天体验会员,去登录