🏀选择题1~5
🌍第1️⃣题
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { unsigned char i = 7; int j = 0; for (; i > 0; i -= 3) { ++j; } printf("%d\n", j); return 0; } //请问该程序的输出是多少 ? A.2 B.死循环 C.172 D.173
🌰考点:无符号数unsigned
💯解题思路:
step1: 程序输出的是j;既判断for循环,循环了多少次;
step2: unsigned char i无符号数的范围: 0~255,for循环直到i变成-2,char的字节为8个,存进i的补码是11111110——>即为254————254/3=84余2所以总共85次
step3: 同理 :for循环直到i变成-1,存进i的为255————255/3=85次
图解
✅答案: 85+85+3=173次 即j=173,选D
🌍第2️⃣题
以下程序运行时,若输入1abcedf2df<回车>输出的结果是?
int main() { char a = 0, ch; while ((ch = getchar()) != '\n') { if (a % 2 != 0 && (ch >= 'a' && ch <= 'z')) ch = ch - 'a' + 'A'; a++; putchar(ch); } printf("\n"); } A 1abcedf2df B 1ABCEDF2DF C 1AbCeDf2dF D 1abceDF2DF
🌰考点:ACSII码大小
💯解题思路:
step1: 首先看ch=ch-‘a’+‘A’;A的ACSII值为65;‘a’的ASCII码值为97,表达式变成:ch=ch-32,即可以把小写字母转化成大写。
step2: 当a=0;ch=1;不满足if条件,则跳出循环,a++;当a=1;ch=a;满足条件,a—>A。
step3: 我们发现转变字符是跳着读的:同理b不变,c转变成C,以此类推算出来的答案是:1AbCeDf2dF
几个常见字母的ASCII码大小: “A”为65;“a”为97;“0”为 48。
✅答案: C选项:1AbCeDf2dF
🌍第3️⃣题
3. 以下哪个选项一定可以将 flag 的第二个 bit 置 0
A flag&=~2
B flag|=2
C flag^=2
D flag>>=2
🌰考点:位操作符
我们先来复习一下位操作符的意思吧
按位与&:只有对应的两个二进位全1才1,全0为0
按位或|:只要对应的二个二进位有一个为1时,结果位就为1。
按位异或^:两数各对应的二进位相异或,当两对应的二进位相异为1,相同为0
.
图解
✅答案: A选项:flag&=~2
🌍第4️⃣题
下面两个结构体
struct One { double d; char c; int i; }; struct Two { char c; double d; int i; }; 在 #pragma pack(4) 和 #pragma pack(8) 的情况下,结构体的大小分别是? A 16 24,16 24 B 16 20,16 20 C 16 16,16 24 D 16 16,24 24
🌰考点:结构体对齐
🗿首先得掌握结构体的对齐规则:
第一个成员在与结构体变量偏移量为0的地址处。
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
💯解题思路:
4字节对齐:
struct One
double b 放在0偏移处,占0~7,8个字节。char c的对齐数是1,8是1的倍数,c可以放在8字节的位置,int i 的对齐数是4,不能放在9.10.11,只能放在12字节占12~15字节,总共占了16个字节。
double b、char c、int i的对齐数分别为4 、1、4。最大对齐数为4
16是4的倍数;所以16是该结构体struct one 的大小!
struct Two
char c放在0偏移处,占1个字节。double b的对齐数是4,4是4的1倍数,b可以放在4~11字节的位置,总共占8个字节。int i 的对齐数是4,12是4的倍数,只能放在12字节占12~15字节,总共占了16个字节。
char c、double b 、int i的对齐数分别为4 、1、4。最大对齐数为4
16是4的倍数;所以16是该结构体struct one 的大小!
8字节对齐:
struct One
double b 放在0偏移处,占0~7,8个字节。char c的对齐数是1,8是1的倍数,c可以放在8字节的位置,int i 的对齐数是4,不能放在9.10.11,只能放在12字节占12~15字节,总共占了16个字节。
double b、char c、int i的对齐数分别为8 、1、4。最大对齐数为8
16是8的俩倍;所以16是该结构体struct one 的大小!
struct Two
char c 放在0偏移处,占1个字节。double b 的对齐数是8,所以1-7的字节被浪费,可以放在8字节的位置,占8~15的字节。int i 的对齐数是4,从16字节处开始,占16~19字节;总共占了20个字节。
char c、double b 、int i的对齐数分别为1 、8、4。最大对齐数为8
24是8的倍数;所以24是该结构体struct Two 的大小!
图解如下:
✅答案: C选项: 16 16,16 24
🌍第5️⃣题
int x = 1; do { printf("%2d\n", x++); } while (x--); A. 1 B.无任何输出 C. 2 D.陷入死循环
🌰考点:while循环♻️
💯解题思路:
♻️ 我们先过一遍循环
x=1;进入循环:x++ , x先使用再 ++ ;x=2
while 判断(x–) ,x=2为真,后x–,x=1继续进入循环
x又=1,陷入死循环
✅答案: D选项: 陷入死循环
🏀选择题6~10
🌍第6️⃣题
下列 C 程序执行后 c 输出结果为 ( ) ( 32 位)
void main() { int a = -3; unsigned int b = 2; long c = a + b; printf("%ld\n", c); } A -1 B 4294967295 C 0x7FFFFFFF D 0xFFFFFFFF
🌰考点:原码反码补码
💯解题思路:
先写出a的原码、反码、补码
b是无符号的正数:原反补码相同
long c = a + b
✅答案: A选项: -1
🌍第7️⃣题
设有定义char *p[]={"Shanghai","Beijing","Honkong"};则结果为j字符的表达式是()
A *p[1] +3
B *(p[1] +3)
C *(p[3] +1)
D p[3] [1]
🌰考点:指针数组
💯解题思路:
首先这是一个指针数组,每个元素都是一个char*的指针
p数组有三个元素,里放的都是首字符的地址:S 、 H、 B
A选项:*p[1]+3 可以理解为找到了B的地址解引用再加3=E;
B选项:*(p[1] +3)可以理解为先找到了B的地址再+3再解引用;+1指向e;+2指向i;+3指向j。
c和d的p[ 3 ]都已经超过了p数组,不存在,所排除。
✅答案: B 选项: *(p[1] +3)
🌍第8️⃣题
int f(int x) { return ((x > 2) ? x * f(x - 1) : 3); } int i; i = f(f(2)); 执行如上函数后. i的值为() A 30 B 无限递归 C 9 D 2160
🌰考点:递归
💯解题思路:
首先 f = 2传进去,x > 2为假,所以x=3;所以f(2)=3;
f = 3 传进去,x > 2为真,执行x * f ( x - 1) = 3*f(2)=9;
✅答案: C 选项: 9
🌍第9️⃣题
在int p[][4] = { {1},{3,2},{4,5,6},{0} }; 中,p[1][2]的值是()
A 1
B 0
C 6
D 2
🌰考点:二维数组
💯解题思路:
首先画出二维数组,除了初始化给的数,其他全为0;
p[1][2]指的是第一行第二列的元素,由下图可知为0
✅答案: B 选项: 0
🌍第🔟题
int fun(int a) { a ^= (1 << 5) - 1; return a; } fun(21)的运行结果是() A 10 B 5 C 3 D 8
🌰考点:位操作符
💯解题思路:
a=21 传进去,1<<5 : 00100000 (1<<5)-1:00011111
21:00010101 异或^:相同为0,相异为1,得出a=10;
✅答案: A 选项: 10
🏀选择题11~15
🌍第1️⃣1️⃣题
下列关于C / C++的宏定义,不正确的是()
A 宏定义不检查参数正确性,会有安全隐患
B 宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量
C 宏的嵌套定义过多会影响程序的可读性,而且很容易出错
D 相对于函数调用,宏定义可以提高程序的运行效率
🌰考点:宏定义
💯解题思路:
排除法:我们发现ACD选项都没有问题,接下来看B选项;
C语言中num是常变量,C++中的num是常量,而且const 修饰的num是有类型的,有类型检查;宏没有类型检查,所以不够严格。
✅答案: B 选项:
🌍第1️⃣2️⃣题
下面关于"指针"的描述不正确的是()
A 当使用free释放掉一个指针内容后, 指针变量的值被置为NULL
B 32位系统下任何类型指针的长度都是4个字节
C 指针的数据类型声明的是指针实际指向内容的数据类型
D 野指针是指向未分配或者已经释放的内存地址
🌰考点:指针基础知识
💯解题思路:
A选项:free释放掉的指针,free不会将它置为空,我们要主动将它置为空指针。
✅答案: A 选项:
🌍第1️⃣3️⃣题
设有以下宏定义:
#define N 3+1 #define Y(n) ((N+1)*n) 则执行语句 z = 2 * ( N + Y(5 + 1) )后, z 的值为 A 60 B 190 C 248 D 其他都错#define N 3+1 #define Y(n) ((N+1)*n) 则执行语句 z = 2 * ( N + Y(5 + 1) )后, z 的值为 A 60 B 190 C 248 D 其他都错
🌰考点:宏定义
💯解题思路:
把宏定义的值原封不动的赋给语句中,N=3+1;Y(n) (( 3+1+1)*n)
z = 2 * ( 3+1 + Y(5 + 1) );Y(n) (( 3+1+1)*n)
Y(n) = (( 3+1+1)*5 + 1) =26;
z=2*(3+1+26)=60;
✅答案: A 选项: 60
🌍第1️⃣4️⃣题
由多个源文件组成的C程序,经过编辑、预处理、编译、链接等阶段会生成最终的可执行程序。下面哪个阶段可以发现被调用的函数未定义?
A 预处理
B 编译
C 链接
D 执行
🌰考点:文件处理
💯查漏补缺:
编辑:也就是编写C/C++程序。
预处理:相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
编译:将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。
链接:通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。 链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够***作系统装入执行的统一整体。在此过程中会发现被调用的函数未被定义。
✅答案: C 选项:链接
🌍第1️⃣5️⃣题
char a ; int b ; float c ; double d ;
则表达式 a* b + d - c 值的类型为()
A float
B int
C char
D double
🌰考点:类型转化
💯解题思路:
任意一次运算,都是把精度低的操作数转换为精度高的操作数,最后的答案,也就是精度最高的数据类型。
double在数据类型转化中级别最高,其他类型都要转化成double
✅答案: D 选项:double
⚽️编程题1️⃣
💥Fibonacci数列:点这里🌠传送门
标题:Fibonacci数列 | 时间限制:1秒 | 内存限制:32768K | 语言限制: 不限
【Fibonacci数列】Fibonacci数列是这样定义的:
F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可 以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。 输入描述: > 输入为一个正整数N(1 ≤ N ≤ 1,000,000) 输出描述: > 输出一个最小的步数变为Fibonacci数" 示例1: > 输入:15 > 输出:2 输入为一个正整数N(1 ≤ N ≤ 1,000,000) 输出一个最小的步数变为Fibonacci数"
💯解题思路:
初始化a=0;b=1;c = a + b; 二者一起不断后移,直到b>n
通过求数据绝对值的函数:abs()求出n距离a 和 n距离b:abs(a - n) 、abs(b - n),比较二者的大小来算出最少步长
📜参考代码
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int a = 0; int b = 1; int c = 0; int n = 0; scanf("%d", &n); while (1) { if (b == n) { printf("0\n"); break; } else if (b > n) { if (abs(a - n) > abs(b - n)) { printf("%d\n", abs(b - n)); } else { printf("%d\n", abs(a - n)); } break; } a = b; b = c; c = a + b; } return 0; }
⚽️编程题2️⃣
🐾替换空格:点这里💥传送门
请实现一个函数,将一个字符串中的每个空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
🐸这道题目是源自身边的,并非凭空捏造
🔥因为搜索字符串,字符串是不能空开的,所以必须要把空格替换掉
在搜索引擎我们可以发现👇🏻
💯解题思路:
str指向的是要处理的字符串,length是要处理的字符串的长度
空格一个要替换成%20 三个字符;意味中are happy要整体后移,空出来两个空格,用来放下%20;同理happy也要整体后移两个位置,以放下%20。
一个空格要换成三个字符,两个空格替换,意味着字符串长了4个字符
设定end1和end2; 分别指向length-1和new length-1字符串的最后一位
遍历一遍str 遇到空格就spacecent ++;
while 循环end1不等于end2,则把end1的值赋予end2;end1–;end2–;
如果str[end1]等于空格则把空格替换成%20;end1–;
直到end1=end2,循环终止;
📜参考代码
class Solution { public: void replaceSpace(char* str, int length) { //数空格 int spacecent = 0; char* p = str; while (*p) { if (*p == ' ') spacecent++; p++; } int newlength = length + 2 * spacecent; int end1 = length - 1; int end2 = newlength - 1; while (end1 != end2) { if (str[end1] != ' ') { str[end2--] = str[end1--]; } else { str[end2--] = '0'; str[end2--] = '2'; str[end2--] = '%'; end1--; } } } };
写在最后🙌
🙏如有错误可以在评论区轰炸我🙏
🥇想学吗?我教你啊🥇
🎉🎉觉得博主写的还不错的可以一键三连撒🎉🎉
💥💥欢迎持续关注!💥💥