覆盖核心基础知识点(数据类型、运算符、分支 / 循环、函数、数组、指针入门等)
一、选择题(40 题)
题目
- 以下不属于 C 语言基本数据类型的是()A. int B. float C. char D. string
- 若定义
int a = 5; float b = 3.2;,则 a + b 的结果类型是()A. int B. float C. char D. double - 以下变量名合法的是()A. 123a B. a-b C. _abc D. int
- 执行
printf("%d", 10 % 3);的输出结果是()A. 1 B. 3 C. 0 D. 2 - 运算符优先级从高到低正确的一组是()A. 算术 > 关系 > 赋值 > 逻辑 B. 算术 > 关系 > 逻辑 > 赋值C. 关系 > 算术 > 逻辑 > 赋值 D. 赋值 > 逻辑 > 关系 > 算术
- 若
int x = 3;,执行 x++; 后 x 的值是()A. 3 B. 4 C. 2 D. 5 - 以下语句中,能正确输入整数 a 和 b 的是()A. scanf ("% d% d", a, b); B. scanf ("% d% d", &a, &b);C. scanf ("% d,% d", &a &b); D. scanf ("% d % d", a &b);
- 条件
a >= 0 && a <= 10等价于()A. a >= 0 || a <= 10 B. a> 0 && a < 10C. !(a < 0 || a > 10) D. !(a <= 0 && a >= 10) - 执行
if(5 > 3) printf("yes"); else printf("no");的输出是()A. yes B. no C. 无输出 D. 编译错误 - 以下循环执行次数是()
int i; for(i=1; i<=5; i++){}A. 4 B. 5 C. 6 D. 011. 数组定义int arr[5];,合法的数组元素访问是()A. arr [0] B. arr [5] C. arr [6] D. arr [-1]12. 函数调用时,实参和形参的个数必须()A. 相等 B. 实参多于形参 C. 形参多于实参 D. 无要求13. 以下能正确定义并初始化一维数组的是()A. int a [5] = {1,2,3,4,5}; B. int a [] = {1,2,3};C. int a [5] = {1,2,3}; D. 以上都正确14. 执行int a = 0; while(a < 3){a++;}后,a 的值是()A. 2 B. 3 C. 4 D. 015. C 语言中,字符常量用()括起来A. 双引号 B. 单引号 C. 括号 D. 方括号16. 若char ch = 'A';,则 ch + 32 对应的字符是()A. 'a' B. 'B' C. 'b' D. '0'17. 以下代码的输出是()
int a = 10, b = 20; printf("%d", a > b ? a : b);A. 10 B. 20 C. 30 D. 018. 函数的返回值类型由()决定A. return 语句中的表达式类型 B. 调用函数时的实参类型C. 函数定义时的返回值类型 D. 形参类型19. 以下循环体执行次数是()
int i = 5; while(i > 0){i--;}A. 4 B. 5 C. 6 D. 020. 定义int *p;,则 p 是()A. 整型变量 B. 指向整型的指针变量 C. 整型数组 D. 函数指针21. 若int a = 5, *p = &a;,则*p的值是()A. 5 B. &a C. p D. 不确定22. 以下代码的输出是()
int arr[] = {1,2,3,4}; printf("%d", arr[2]);A. 1 B. 2 C. 3 D. 423. C 语言中,注释的符号是()A. // B. /* / C. // 或 /* */ D. #24. 执行for(int i=0; i<5; i+=2){},循环体执行次数是()A. 2 B. 3 C. 4 D. 525. 若int x = 2, y = 3;,则 x *= y + 2 后 x 的值是()A. 8 B. 10 C. 7 D. 626. 以下不能实现循环的语句是()A. for B. while C. if D. do-while27. 字符串 "abc" 在内存中占用的字节数是()A. 3 B. 4 C. 5 D. 228. 以下代码的输出是()
int a = 3; if(a = 0) printf("yes"); else printf("no");A. yes B. no C. 编译错误 D. 无输出29. 函数参数传递中,值传递的特点是()A. 形参修改会影响实参 B. 形参修改不影响实参C. 实参和形参共用内存 D. 必须传递指针30. 定义float f = 3.14;,输出 f 的正确 printf 格式符是()A. % d B. % f C. % c D. % s31. 以下代码的输出是()
int i = 1; do{printf("%d", i); i++;}while(i <= 3);A. 12 B. 123 C. 23 D. 32132. 若int a[3][2] = {{1,2},{3,4},{5,6}};,则 a [1][1] 的值是()A. 3 B. 4 C. 5 D. 633. C 语言程序的入口是()函数A. main B. printf C. scanf D. include34. 执行int a = 8 / 3;,a 的值是()A. 2 B. 2.666 C. 3 D. 035. 逻辑运算符&&中,若第一个表达式为假,则第二个表达式()A. 执行 B. 不执行 C. 可能执行 D. 编译错误36. 以下代码的输出是()
c
运行
int x = 5; if(x++ > 5) printf("%d", x); else printf("%d", x);A. 5 B. 6 C. 7 D. 437. 数组名作为函数参数时,传递的是()A. 数组第一个元素的值 B. 数组的首地址C. 数组所有元素的值 D. 数组的长度38. 定义const int a = 10;,则 a 的值()A. 可以修改 B. 不能修改 C. 只能修改一次 D. 编译错误39. 以下代码的输出是()
int a = 2, b = 3; int c = a * b; printf("%d", c);A. 5 B. 6 C. 23 D. 3240. do-while 循环的特点是()A. 先判断条件,后执行循环体 B. 先执行循环体,后判断条件C. 循环体可能不执行 D. 条件为真时退出循环
答案
1.D 2.B 3.C 4.A 5.B 6.B 7.B 8.C 9.A 10.B11.A 12.A 13.D 14.B 15.B 16.A 17.B 18.C 19.B 20.B21.A 22.C 23.C 24.B 25.B 26.C 27.B 28.B 29.B 30.B31.B 32.B 33.A 34.A 35.B 36.B 37.B 38.B 39.B 40.B
解析
- string 不是 C 语言基本类型,C 中字符串用字符数组 / 指针表示;
- 不同类型运算时,低精度(int)自动转换为高精度(float);
- 变量名只能以字母 / 下划线开头,不能是关键字,不能含特殊字符;
- % 是取余运算符,10 除以 3 余 1;
- 优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符;
- x++ 是后置自增,先使用后加 1,执行后 x=4;
- scanf 输入时,变量前必须加 & 取地址符,多个变量用逗号 / 空格分隔;
- 原条件是 a 在 0-10 之间,等价于 “a 不小于 0 且不大于 10”,即 “非(a<0 或 a>10)”;
- 5>3 为真,执行 if 分支输出 yes;
- i 从 1 到 5,共循环 5 次(1、2、3、4、5);
- 数组下标从 0 开始,arr [5] 超出数组范围(下标最大为 4);
- 函数调用时实参和形参个数、类型需一一对应;
- A 是完整初始化,B 是省略长度(由初始化列表决定),C 是部分初始化(未初始化元素为 0);
- a 从 0 开始,每次加 1,直到 a=3 时退出循环;
- 字符常量用单引号,字符串用双引号;
- 'A' 的 ASCII 码是 65,加 32 后是 97(对应 'a');
- 三目运算符:条件为真取?后的值,假取:后的值,20 更大;
- 函数返回值类型由定义时的返回值类型决定,return 表达式类型需兼容;
- i 从 5 到 1,共循环 5 次(5、4、3、2、1);
- 表示指针,int *p 表示 p 是指向整型的指针;
- *p 是解引用,取指针指向的变量值,即 a=5;
- 数组下标从 0 开始,arr [2] 是第三个元素 3;
- C 语言支持单行注释 // 和多行注释 /* */;
- i 取值 0、2、4,共 3 次;
- x= y+2 等价于 x = x(y+2)=2*(3+2)=10;
- if 是分支语句,不是循环语句;
- 字符串末尾自动加 '\0' 结束符,所以 3+1=4 字节;
- if (a=0) 是赋值语句(不是判断),a 被赋值为 0,执行 else 分支;
- 值传递时,形参是实参的副本,修改形参不影响实参;
- % f 是浮点型输出格式符,% d 是整型,% c 是字符,% s 是字符串;
- do-while 先执行循环体,i 依次输出 1、2、3;
- 二维数组 a [行][列],a [1][1] 是第二行第二列,值为 4;
- main 函数是 C 程序的入口;
- 整数除法舍去小数部分,8/3=2;
- && 是短路与,第一个表达式为假时,第二个不执行;
- x++ 是后置自增,先判断 5>5(假),再 x=6,执行 else 输出 6;
- 数组名作为参数传递的是首地址,属于地址传递;
- const 修饰的变量是只读的,不能修改;
- 2*3=6,输出 6;
- do-while 先执行循环体,再判断条件,循环体至少执行一次。
二、填空题(40 题)
题目
- C 语言中,整型常量的默认类型是______。
- 表达式
3 + 4 * 5的结果是______。 - 定义
int a = 10;,执行 a -= 3; 后,a 的值是______。 - 输入函数 scanf 的格式控制字符串中,整型变量对应的格式符是______。
- 循环语句中,break 的作用是______。
- 数组
int arr[4] = {10,20,30};中,arr [3] 的值是______。 - 函数定义时,无返回值的函数类型应声明为______。
- 字符 '0' 的 ASCII 码值是______。
- 表达式
!(5 > 3)的结果是______(用 0/1 表示)。 - 定义
float f = 5.6;,将 f 强制转换为整型的表达式是______。 - 二维数组
int a[2][3];的元素个数是______。 - 指针变量 p 指向变量 x,则 p = ______。
- 循环语句中,continue 的作用是______。
- 字符串 "hello" 的长度是______(不含结束符)。
- 表达式
5 == 5的结果是______(用 0/1 表示)。 - 定义
int a = 5, b = 7;,交换 a 和 b 的值的临时变量法中,需定义int t;,则第一步是t = ______。 - C 语言程序的基本组成单位是______。
- 输出函数 printf 中,字符型变量对应的格式符是______。
- 表达式
3 < 5 && 6 > 4的结果是______(用 0/1 表示)。 - 函数调用时,实参和形参的传递方式默认是______传递。
- 定义
int a[5];,数组下标的范围是从______到______。 - 表达式
(int)3.9的结果是______。 - do-while 循环的结束条件是______。
- 逻辑或运算符的符号是______。
- 定义
char str[] = "c 语言";,str 在内存中占用的字节数是______。 - 表达式
a = 10, b = 20, a + b的结果是______。 - 函数的形参在______时分配内存。
- 表达式
sizeof(int)的结果是______(字节)。 - 循环
for(i=0; i<10; i++)中,循环结束后 i 的值是______。 - 定义
int *p, a = 8;,使 p 指向 a 的语句是______。 - 表达式
'a' > 'b'的结果是______(用 0/1 表示)。 - 分支语句中,多分支选择可以使用______语句。
- 数组初始化时,若省略长度,则由______决定数组长度。
- 表达式
10 / 2 * 5的结果是______。 - 函数返回值使用______语句。
- 定义
int a = 0;,执行 a++ 后 a 的值是______。 - 输入多个字符时,scanf 的格式符是______。
- 表达式
!0的结果是______(用 0/1 表示)。 - 二维数组
int b[3][4] = {1,2,3};中,b [0][2] 的值是______。 - C 语言中,头文件包含使用的预处理指令是______。
答案
- int
- 23
- 7
- %d
- 跳出当前循环
- 0
- void
- 48
- 0
- (int)f
- 6
- &x
- 跳过本次循环剩余语句,进入下一次循环判断
- 5
- 1
- a
- 函数
- %c
- 1
- 值
- 0、4
- 3
- 条件表达式为假
- ||
- 4(注:"c 语言" 包含 'c'、' 语 '、' 言 '、'\0',中文占 2 字节的话是 7,考查课默认按简单字符算 4)
- 30
- 函数调用
- 4(32 位 / 64 位系统均为 4)
- 10
- p = &a;
- 0
- switch
- 初始化列表的元素个数
- 25
- return
- 1
- %s
- 1
- 3
- #include
解析
- 整型常量默认是 int 类型,长整型需加 L;
- 优先级:乘法 > 加法,4*5=20+3=23;
- a -=3 等价于 a = a-3=10-3=7;
- % d 对应整型,% f 浮点,% c 字符,% s 字符串;
- break 跳出整个循环,continue 跳过本次循环;
- 数组部分初始化时,未赋值元素默认为 0;
- void 表示无返回值,函数无需 return(或 return;);
- '0' 的 ASCII 是 48,'1' 是 49,以此类推;
- 5>3 为真,! 真 = 假(0);
- 强制类型转换格式:(目标类型) 表达式;
- 二维数组元素个数 = 行数 × 列数 = 2×3=6;
- & 是取地址符,p=&x 表示 p 指向 x 的地址;
- continue 不跳出循环,仅跳过本次循环后续代码;
- 字符串长度是有效字符数,不含 '\0';
- == 是相等判断,5==5 为真(1);
- 临时变量法交换:t=a; a=b; b=t;;
- 函数是 C 程序的基本组成单位,main 是入口函数;
- % c 用于输出单个字符;
- 3<5 为真,6>4 为真,&& 两边都真则结果为真(1);
- 默认值传递,地址传递需用指针 / 数组;
- 数组下标从 0 开始,长度为 5 则下标 0-4;
- 强制转换整型舍去小数部分,3.9→3;
- do-while 先执行后判断,条件为假时退出;
- || 是逻辑或,&& 是逻辑与,! 是逻辑非;
- 考查课简化:"c 语言" 含 3 个字符 + 1 个结束符 = 4 字节;
- 逗号表达式取最后一个表达式的值,10+20=30;
- 形参仅在函数调用时分配内存,调用结束释放;
- int 类型占 4 字节(主流系统);
- i 到 10 时不满足 i<10,循环结束,i=10;
- p=&a 使指针 p 指向 a 的地址;
- 'a'ASCII 是 97,'b' 是 98,97>98 为假(0);
- switch 用于多分支,case 匹配常量;
- 省略数组长度时,初始化列表有几个元素,数组长度就是几;
- 乘除优先级相同,从左到右:10/2=5×5=25;
- return 返回函数值,无返回值可写 return;;
- a++ 后置自增,0→1;
- % s 用于输入字符串;
- !0(假)= 真(1);
- b [0][2] 是第一行第三个元素,初始化列表第三个值是 3;
- #include 用于包含头文件(如 stdio.h)。
三、判断题(40 题)
题目
- C 语言的标识符可以以数字开头。()
- 浮点型变量可以存储整数。()
if(5)中的条件 5 表示真。()- for 循环的三个表达式都可以省略。()
- 数组的下标可以是负数。()
- 函数可以没有参数。()
printf("hello");输出后会自动换行。()- 逻辑运算符
||是短路或,第一个表达式为真时第二个不执行。() int a = 5; float b = a;是合法的类型转换。()- switch 语句中必须有 default 分支。()
- 指针变量的大小与指向的变量类型无关。()
scanf("%d", &a);中 & 符号可以省略。()- do-while 循环的循环体至少执行一次。()
- 字符串常量用单引号括起来。()
int a[3] = {1,2,3,4};是合法的数组初始化。()- 函数的返回值类型可以是数组。()
a = a + 1;等价于 a++;。()- C 语言中,0 表示假,非 0 表示真。()
- 二维数组的行和列下标都从 0 开始。()
const int a;可以后续赋值。()- break 语句可以用于 if 语句中。()
- 函数调用必须在函数定义之后。()
sizeof(char)的结果是 1 字节。()int *p = 5;是合法的指针赋值。()- 逗号运算符的优先级最低。()
if(a = 5)是判断 a 是否等于 5。()- 数组名是一个常量,不能赋值。()
- return 语句可以出现在函数的任意位置。()
while(0)的循环体永远不会执行。()- 字符型变量可以参与算术运算。()
#include <stdio.h>必须写在程序的第一行。()- 函数的形参属于局部变量。()
int a = 10 % 0;是合法的表达式。()for(i=0; i<5; ){i++;}是合法的 for 循环。()- 指针变量可以进行算术运算。()
printf("%d", 'a');会输出 97。()- 全局变量的作用域是整个程序。()
- continue 语句可以跳出循环。()
int a[][3] = {1,2,3,4,5,6};是合法的二维数组定义。()- C 语言程序必须包含 main 函数。()
答案
1.× 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.× 34.√ 35.√ 36.√ 37.√ 38.× 39.√ 40.√
解析
- 标识符只能以字母 / 下划线开头,不能以数字开头;
- 浮点型可存储整数(如 5.0);
- 非 0 值在条件中表示真;
- for 循环三个表达式均可省略(如 for (;;) 是无限循环);
- 数组下标不能为负数,属于越界访问;
- 函数可以无参数(如 void func (){});
- printf 默认不换行,需加 \n;
- 短路或:第一个为真时,第二个无需执行,结果已确定为真;
- 低精度(int)可自动转换为高精度(float);
- switch 的 default 分支可选,无匹配 case 时执行;
- 指针变量大小取决于系统(32 位 4 字节,64 位 8 字节),与指向类型无关;
- scanf 输入普通变量必须加 &,数组名除外;
- do-while 先执行后判断,至少执行一次;
- 字符串常量用双引号,字符常量用单引号;
- 数组长度为 3,初始化列表有 4 个元素,越界;
- 函数不能返回数组,可返回指针;
- a++ 等价于 a=a+1(后置自增);
- C 语言中条件判断:0 为假,非 0 为真;
- 二维数组行、列下标均从 0 开始;
- const 修饰的变量必须初始化,且不能修改;
- break 只能用于循环 /switch,不能用于 if;
- 函数调用可在定义前,只需提前声明;
- char 类型占 1 字节(标准);
- 指针必须赋值地址,不能直接赋值数值;
- 逗号运算符优先级最低,赋值次之;
- a=5 是赋值,判断相等需用 a==5;
- 数组名是首地址常量,不能赋值(如 arr=10 错误);
- return 可在函数任意位置,执行后退出函数;
- while (0) 条件为假,循环体不执行;
- 字符型本质是 ASCII 码,可参与算术运算;
- #include 可写在程序任意位置(通常开头),只要在使用前;
- 形参仅在函数内有效,属于局部变量;
- 除数不能为 0,% 取余也一样,会运行错误;
- for 循环第三个表达式可省略,在循环体内更新 i;
- 指针可进行加减算术运算(如 p++);
- 'a' 的 ASCII 码是 97,% d 输出其数值;
- 全局变量定义在函数外,作用域是整个程序;
- continue 仅跳过本次循环,不跳出循环;
- 二维数组可省略行数,由初始化列表决定;
- main 函数是 C 程序入口,必须有且仅有一个。
四、编程题(10 题)
题目 1:输入两个整数,输出它们的和
代码
#include <stdio.h> int main() { int a, b, sum; printf("请输入两个整数:"); scanf("%d%d", &a, &b); sum = a + b; printf("和为:%d\n", sum); return 0; }解析
- 核心知识点:变量定义、scanf 输入、printf 输出、算术运算;
- 步骤:定义整型变量→提示输入→读取两个数→计算和→输出结果。
题目 2:判断一个整数是否为偶数
代码
#include <stdio.h> int main() { int num; printf("请输入一个整数:"); scanf("%d", &num); if(num % 2 == 0) { printf("%d 是偶数\n", num); } else { printf("%d 是奇数\n", num); } return 0; }解析
- 核心知识点:if-else 分支、取余运算符 %;
- 逻辑:偶数能被 2 整除,即 num%2==0。
题目 3:输出 1 到 100 之间的所有奇数
代码
#include <stdio.h> int main() { int i; printf("1到100的奇数:\n"); for(i=1; i<=100; i++) { if(i % 2 != 0) { printf("%d ", i); } } printf("\n"); return 0; }解析
- 核心知识点:for 循环、if 判断;
- 优化写法:i 从 1 开始,每次 + 2(i+=2),无需判断,效率更高。
题目 4:计算 1+2+3+…+100 的和
代码
#include <stdio.h> int main() { int i, sum = 0; for(i=1; i<=100; i++) { sum += i; // 等价于sum = sum + i } printf("1到100的和:%d\n", sum); return 0; }解析
- 核心知识点:for 循环、累加运算;
- 注意:sum 初始值必须为 0,否则会是随机值。
题目 5:输入一个字符,判断是否为大写字母,若是则转为小写
代码
#include <stdio.h> int main() { char ch; printf("请输入一个字符:"); scanf("%c", &ch); if(ch >= 'A' && ch <= 'Z') { ch += 32; // 大写转小写,ASCII码+32 printf("转换后:%c\n", ch); } else { printf("不是大写字母\n"); } return 0; }解析
- 核心知识点:字符型变量、ASCII 码运算、范围判断;
- 逻辑:大写字母 A-Z 的 ASCII 码 65-90,小写 a-z 97-122,差值 32。
题目 6:求一个数组中的最大值
代码
#include <stdio.h> int main() { int arr[] = {12, 45, 7, 89, 23}; int max = arr[0]; // 初始化为第一个元素 int i, len = sizeof(arr)/sizeof(arr[0]); // 计算数组长度 for(i=1; i<len; i++) { if(arr[i] > max) { max = arr[i]; } } printf("数组最大值:%d\n", max); return 0; }解析
- 核心知识点:数组、sizeof 计算长度、循环找最大值;
- 步骤:初始化 max 为第一个元素→遍历数组→比较更新 max。
题目 7:使用函数计算两个数的乘积
代码
#include <stdio.h> // 函数定义:计算乘积 int multiply(int x, int y) { return x * y; } int main() { int a, b, res; printf("请输入两个整数:"); scanf("%d%d", &a, &b); res = multiply(a, b); // 函数调用 printf("乘积:%d\n", res); return 0; }解析
- 核心知识点:函数定义、函数调用、形参 / 实参;
- 注意:函数返回值类型与定义一致(int)。
题目 8:输入一个正整数,判断是否为素数
代码
#include <stdio.h> int main() { int num, i, flag = 1; // flag=1表示素数 printf("请输入一个正整数:"); scanf("%d", &num); if(num < 2) { // 小于2的数不是素数 flag = 0; } else { for(i=2; i*i <= num; i++) { // 优化:只需遍历到√num if(num % i == 0) { flag = 0; break; // 找到因数,跳出循环 } } } if(flag) { printf("%d是素数\n", num); } else { printf("%d不是素数\n", num); } return 0; }解析
- 核心知识点:素数判断逻辑、循环优化、flag 标记;
- 素数定义:大于 1,且只能被 1 和自身整除的数。
题目 9:输出 99 乘法表
代码
#include <stdio.h> int main() { int i, j; for(i=1; i<=9; i++) { // 行 for(j=1; j<=i; j++) { // 列,列数≤行数 printf("%d×%d=%d\t", j, i, i*j); } printf("\n"); // 换行 } return 0; }解析
- 核心知识点:嵌套 for 循环、制表符 \t;
- 逻辑:外层循环控制行,内层控制列,保证列数不超过行数。
题目 10:使用指针交换两个整数
代码
#include <stdio.h> // 指针交换函数 void swap(int *x, int *y) { int t = *x; *x = *y; *y = t; } int main() { int a, b; printf("请输入两个整数:"); scanf("%d%d", &a, &b); printf("交换前:a=%d, b=%d\n", a, b); swap(&a, &b); // 传递地址 printf("交换后:a=%d, b=%d\n", a, b); return 0; }解析
- 核心知识点:指针、地址传递、函数参数;
- 注意:值传递无法交换,需传递地址(指针),void 函数无返回值。