✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!!
📃个人主页:@rivencode的个人主页
🔥系列专栏:《C语言入门必刷百题》
💬保持学习、保持热爱、认真分享、一起进步!!
一.选择题
试题1:
da
答案:C
解析:该题主要考察了操作符的优先级,首先+号比+=、-=操作符优先级要高,因为像=、/= 、+=、-=优先级比赋值=优先级都要低,所以表达式等价于a += a -= (a + a);先算加法,第二个考察的点就是操作符的结合性,像=、/= 、+=、-= 这些操作符的结合性都是从右往左计算,也就是等价于 a += (a -= (a + a));**
知识点详情参考:C语言操作符详解
试题2:
答案:D
解析:
ABC选项:数组的下标下限为0
D选项:定义了两个字符变量c1、c2,一个字符指针变量c3,一个字符数组c4。
试题3:
答案:D
解析:
~:按位取反
^:异或:相同为0,相异为1
求反运算~
求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。
注意:符号位照样取反
按位异或运算 ^
按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进制位相异或,当两对应的二进制位相异时结果为1,相同结果为0,
按为异或的特点:
最好能记住解题块的很
性质:
1.交换律 a^ b = b^a
2.结合律 a^ b ^ c = a^ (b^c)
3.任何数后零异或都是它本身
4. 自身与自身异或为0
其实上面的特点很好证明只要记住:相同为0,相异为1
知识点详情参考:C语言操作符详解
试题4:
答案:C
解析:
1."A’与’A’是不相同的,一个是字符串一个是字符,其实"A"字符串后面还隐藏了一个\0字符代表字符串的结束标志。
2.他们都是常量,常量可以是任何的基本数据类型,比如单独一个10或者单独一个3.14都是常量。
试题5:
答案:B
解析:
a,b都是整形,则a/b结果必定是整数,得出的结果是小数怎么办?,只能是取整,而取整的方式有三种:
1.向负无穷取整
2.向整无穷取整
3.向零取整
C语言中默认是向零取整,这里只讲向零取整,其他看下面的知识点详情。
什么是向零取整:
其实C语言中的默认取整方式是向零取整
c=a/b+0.4
首先a/b直接就取整为1了,1+0.4取整为1,则c=1
知识点详情参考:深度理解取余取模运算
试题6:
答案:D
解析:
题目中创建了一个a数组,p指针变量初始化等于a,a为数组名,数组名一般情况下都表示为数组首元素的地址,
有两种特殊情况:
1.sizeof(数组名):表示求整个数组的大小(单位为字节)
2.&数组名:表示整个数组地址,&数组名+1跳过整个数组
则在这里p整个指针变量就保存了数组首元素2的地址。
a[i]=*p++;//++操作符的优先级比 *解引用操作高,但是这里的++是后置++则先a[i]=*p然后再p++,则其实数组的内容并没有发生变化。
程序等价于下图:
试题7:
答案:C
解析:
这个题得好好讲讲,总有人分不清下面两句代码的区别。
看下图就明白了:
这里来解决几个疑问:
1.char* s1 = “Hello world” 是代表什么意思?
我们都知道s1是一个char 类型的指针变量,要存储一个字符的地址,而 “Hello world” 就是代表首元素’H’字符的地址,相当于s1指向了’H’这个字符,则就可以通过s1这个指针变量来找到这个字符串。
2."Hello world"是一个常量的字符串只不过我们用栈区定义的一个指针变量s1来指向这个字符串的首元素’H’的地址,是常量该字符串不能被修改。
3.s1[i]等价于(s1+i)
知识点详情参考:字符串与内存操作函数详解与模拟实现
试题8:
答案:B
解析:
首先是三目运算符:
是不是会感觉有点奇怪,a=1,b=-3,为啥a+b会是正数呢,原因就在于存在算术转化:请看下图
(无符号)unsigned int 的排名要比 (有符号)signed int要高,则a+b的结果的类型是无符号数,我们知道无符号数一定为正数,其实a+b的结果是一个很大的正数。
如果你觉得上图是正常的,那你看看下图:
怎么用%d打印又是负数呢?
其实啊在计算机中我们存储的所有东西包括字符,汉字,数字,统统会转化为对应的二进制序列,不同类型的数据像整形,字符型,浮点型…,在计算机中都是以二进制的形式进行存储,则同样一段二进制序列用不同的类型去解释就会得到不同结果,则在本题中,a+b的计算结果存储在CPU的某个寄存器中(结果也是二进制,不过它的类型是无符号整形)),但是我们硬要用%d进行打印,也就是说以有符号的整形进行打印则这段二进制(在计算机中存储的整数都是以补码的形式),就会被解释成有符号的整数。
知识点详情参考:C语言深度解剖之数据到底在内存中如何存储
试题9:
答案:A
解析:
总结:continue:while,do while 跳转到条件判定,for转到到i++然后再判定,在本题中,3的倍数会被跳过不打印。
试题10:
答案:C
解析:
这题主要考察了结构体内存对齐的知识:
先看内存对齐规则:
这里的大小都是以字节为单位
- 第一个成员在相对于结构体变量地址偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(成员变量的对齐数)的整数倍的地址处。
成员变量的对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8 - 结构体总大小为最大对齐数(每个成员变量都有一个对齐数,)是成员变量的最大对齐数的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
此外:像char a[10] ,不过只是10个char类型的变量堆叠而成,本质对齐数还是1,short c[3]同理。
知识点详情参考:结构体详解-内存对齐
二.编程题
点击题目即可跳转刷题
1.BC11成绩输入输出
1.题目描述
2.解题思路
题目很简单,主要是要按照题目给的格式进行打印
3.代码实现
#include <stdio.h>
int main()
{
int a;
int b;
int c;
//
scanf("%d %d %d",&a,&b,&c);
printf("score1=%d,score2=%d,score3=%d",a,b,c);
return 0;
}
4.相关知识点
2.BC12学生基本信息输入输出
1.题目描述
2.解题思路
1.按照格式进行输入输出,格式的话一直复制题目给的就好了(以免出错)。
2.保留两位小数
C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。
float采用%f占位符。
double采用%lf占位符。测试结果证明,double不可以用%f输入,但可以用%f输出,但是不建议采用%f,因为不同的编译器可能会有差别。
printf("%.nlf",value); /* 表示保留n位小数 */
printf("%m.nlf",value); /* 表示控制宽度为m,保留n为小数,右对齐 */
printf("%-m.nlf",value); /* 表示控制宽度为m,保留n为小数,m前面的-表示左对齐 */
3.代码实现
int main()
{
int id=0;
float C=0.0;
float math=0.0;
float english=0.0;
scanf("%d;%f,%f,%f",&id,&C,&math,&english);
printf("The each subject score of No. %d is %.2f, %.2f, %.2f.",id,C,math,english);
return 0;
}
4.相关知识点
C语言中%5d %05d %-5d %.5d 的区别:
总结:
如果d前面的是正数则右对齐,其余往左补零或空格
如果d前面的是负数则右对齐,其余往右补零或空格
超过的这个数,全取就好了
浮点数的格式也差不多,只不过中间用.分隔。
printf("%.nlf",value); /* 表示保留n位小数 */
printf("%m.nlf",value); /* 表示控制宽度为m,保留n为小数,右对齐 */
printf("%-m.nlf",value); /* 表示控制宽度为m,保留n为小数,m前面的-表示左对齐
其实这些格式还是很有用的,尤其是输出到屏幕上的格式。
输出到屏幕上其实都是字符:这个字符包括数字,英文,汉字等其他国家的语言。
就拿汉字来说,我们用字符串可以存储汉字,但如何存储呢?
我们都知道计算机只能存储二进制序列,像ASCLL码一样,'A’用65表示,其实汉字也是一样只不过汉字比英文26个字母多的多,可能一个汉字需要几个字节来表示,当然也有不同的汉字编码。
详情参考:液晶显示中英文
3.BC13出生日期输入输出
1.题目描述
2.解题思路
看上题知识点讲解这题当练手了
3.代码实现
int main()
{
int a,b,c;
scanf("%4d %2d %2d",&a,&b,&c);
printf("year=%d\n",a);
printf("month=%02d\n",b);
printf("date=%02d\n",c);
}
2.BC14按照格式输入并交换输出
1.题目描述
2.解题思路
与上题一样主要考察的就是按照已给格式进行输入输出,当然简单的交换两个元素(通过一个临时变量来实现交换)。
3.代码实现
int main() {
int a;
int b;
int tmp;
scanf("a=%d,b=%d",&a,&b);
tmp=a;
a=b;
b=tmp;
printf("a=%d,b=%d",a,b);
return 0;
}
5.BC15大小写转换
1.题目描述
2.解题思路
题目中多组输入,指的是会可能输入1组也可能输入3组,所以我们需要搞个循环,输入一个字符可以用ch=getchar()函数,也可以使用scanf(“%c”,&ch )的形式,输出一个字符可以用putchar(ch),也可以使用printf(“%c”,ch )的形式,对于大小写字母转化,其实对应的大写字母与小写字符它们的ASCll值相差32。
大写转小写:大写字母+32
小写转大写:大写字母-32
这些字符都是以ASCll值(十进制)对应的二进制序列存储在内存中。
3.代码实现
int main()
{
char ch;
//EOF本质为-1,作为文本的结束标志,字符的取值范围为0~255不可能出现负数
while ((ch = getchar()) != EOF)
{
//读取输入缓存区\n字符,防止被ch读取
getchar();
//大写转小写
if (ch>= 'A' && ch <= 'Z')
printf("%c\n", ch + 32);
//小写转大写
else if (ch >= 'a' && ch <= 'z')
printf("%c\n", ch - 32);
else
printf("输入错误\n");
}
return 0;
}
当我敲一个A字符然后需要敲一个回车,其实A字符与\n字符一起被放在输入缓冲区,ch=getchar()只会取出一个字符A,\n回车还在输入缓冲区中,则需要用getchar()将\n读取走,防止下次ch=getchar(),ch读取到\n。
三.如何高效刷题
如何刷题:
1.如果你是基础不太好,可以先按照题解,跟着手打代码,重点理解题目思路,将题目所用到的知识点,解题技巧提炼出来(锻炼代码能力,解题思路)。
2.当有一定的代码能力之后,但是看题还是没有思路,可以先看解题思路理解它,然后尝试用代码去实现它。(主要锻炼代码能力,进一步锻炼解题思维)
3.拿到一个题目自己先尝试解题,最好是能将解题思路用画图的方式体现出来,这样更能加深印象,然后用代码实现,实现之后再看看题解,或者别人的解题方法,进行对比,找到最优解题思路
最后:在解题过程中,碰到问题如下图(题目提交后通不过,报错(代码可能有bug),尽量独立思考,可以先尝试用它的测试用例,一步一步走读代码,看看问题出现在那个地方,如果实在是没有看出来,可以将该函数拷贝到VS中进行调试代码,一定能找出来。(锻炼自己的代码调试能力)