目录
- 一、语法题
- strlen+转义字符
- 内置数据类型
- 字符串结束标志
- 局部变量和全局变量名字冲突 局部优先
- switch语句中的关键字
- 数组初始化是否正确
- 注意define不是关键字
- C语言中不能用连等判断
- switch( )的括号里可以是什么类型?
- 关于if
- 关于switch
- 二、程序阅读题
- 有关static
- 有关continue
- 说明代码的功能
- for循环省略部分条件
- 计算循环次数
- 代码阅读(=和==)
- 关于switch的穿透现象
- switch嵌套
- 三、运算式相关
- 逗号表达式
一、语法题
strlen+转义字符
- 答案为6 14
- \t和\62是两个转义字符 注意八进制里是不可能有8的
//程序输出什么?
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));//6
// \62被解析成一个转义字符
printf("%d\n", strlen("c:\test\628\test.c"));//14
return 0;
}
- 这样改一下 就是一个陷阱了
- 确实是变成了13个字符 但是这道题会直接报错 因为八进制627>127
//程序输出什么?
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
// \62被解析成一个转义字符
printf("%d\n", strlen("c:\test\627\test.c"));
return 0;
}
- 这题就是7 \121算一个 而且没超过127
内置数据类型
- C是自定义类型
字符串结束标志
局部变量和全局变量名字冲突 局部优先
switch语句中的关键字
- 分支有if和switch两种
- continue是用于跳过当次循环 进入下一次循环的;break是结束当前这一层循环的
- 在switch分支里 可以有break(防止case穿透) 但是肯定没有continue
- continue只可能在循环里出现
数组初始化是否正确
-
A没问题 不完全初始化的部分默认为0
-
B绝对错误 哪怕是支持C99也不对! 因为变长数组是不可以显式初始化的!
-
C没问题 虽然没指定大小 但是会根据显式初始化的内容确定大小
-
D字符数组 没问题 注意自带’\0’
-
选B
-
可以说明VS2022不支持C99标准 也就不支持变长数组
-
就算支持C99 那也不能初始化数组
-
不初始化是下面这种写法
注意define不是关键字
- #define是预处理指令
C语言中不能用连等判断
- 下面那部分不能写成90<=score<=100 就算答案有可能是对的 那也是运气 这种写法逻辑就不对
switch( )的括号里可以是什么类型?
- 注意char的本质还是整型 switch要求的就是整型表达式
- 故选D
关于if
- B只能说1可以表示真 因为非0都是真 -1也是真
- C肯定是对的 单选的话就选C
关于switch
二、程序阅读题
有关static
- 核心在于static修饰的b 没次调用完sum b是不销毁的
- 而c每次都会重新创建 从0开始
i:0->1->2
a:2->2->2->2
c:0->1->0->1->0->1
static b:3->5->7->9
结果:
打印8,10,12,14,16
有关continue
- 本题打印1 2 3 4之后就开始死循环
- n=5后 n++再也没机会执行
说明代码的功能
- 如果不是在0~9就不打印
- 所以是:读取一个数 如果他是0~9的数字 就把他打印出来
for循环省略部分条件
请问下面的代码会循环几次?
3*3=9次
i = 0 的时候 j = 0,1,2,3 最终j变成了3 一共循环三次
然后i = 1 再进入内存循环 j还是3 不会进入循环
然后i = 2 j还是3 不进去 然后i = 3 全都结束
从头到尾只有i = 0的时候 循环了三次
计算循环次数
- 中间的表达式2 是for的判断部分
- k=0是个
赋值语句
该表达式的结果恒为0 也就是说判断部分恒为0 - 恒为假 一次都不循环
- 0次循环
代码阅读(=和==)
- 每次进入循环 i都被改为5 表达式的值就是5 为真 打印5 然后i++ 6<10 又进去了 又变成了5
- 所以会死循环的打印5
关于switch的穿透现象
- a就是决定了程序的入口 然后一路上都没有遇到break
所以case 3执行完 没有break的话 default也会执行的
- 最后返回b 返回0 也就是func(1) = 0
switch嵌套
- 先进入外层switch的case 1
- 然后进入内层的case 3 也就是default 打印hello
- 打印完hello 其实相当于是执行完了外层switch的case 1 发现case 1没有break 所以继续执行外层switch的case 2 打印third
- 故答案是 打印hellothird
三、运算式相关
逗号表达式
- 核心在于 逗号表达式的优先级是所有运算符里最最最低的 比赋值都低!!
- 先算a = 27 然后a/5的值作为( )里逗号表达式的结果 赋给i 所以i = 5
- 然后虽然会继续执行一下a+11 但是不会影响i的值
- 故选A
- 第一步:逗号表达式
(a = 3 * 9, a / 5)
的值赋给i - 第二步:
i = (a = 3 * 9, a / 5), a + 11;
这整体是一个逗号表达式 不影响a或者i的值 单纯执行了一遍
- 要这么写的话 m的值就是38了