C++的练习路1C++的选择题练习
Posted Guerrouj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++的练习路1C++的选择题练习相关的知识,希望对你有一定的参考价值。
虽然是C++的练习题,但还是掺杂了不少C的内容,并且许多内容为基础选项,整体来说学的比较差劲。 emmm,,,,这正确率:简直就是祖国山河一片红 题库链接 https://www.nowcoder.com/test/question/done?tid=13202411&qid=94173#summary下面来进行解析
第一题
解析
该题定义了结构体ss的对象数组:std,大小为3,然后定义结构体指针p指向std数组,问下面哪个错误。 首先第一个我没复习结构体,第二个对%d,%s,%c很晕,感觉选B的原因是&std应该是指整个数组,并没有指向哪个对象,所以.name将出现错误。参考 链接中的回复,给出的解释为: std为数组名,不能用.而应该用->解引用收元素,如果采用&(std->name)则可行。
接下来为解惑时间 1,关于一堆%号的回忆 很久没看C了,对这种定义基本忘记了;经查阅,该符号为转换说明符,表明输入输出的形式。 %c表示字符,%s表示字符串,%d表示有符号十进制整数,%f表示浮点数,%p表示指针
2,结构体的学习 由于手头的书主要涉及C++的内容,内部包含不多,有些许遗漏,后续需要阅读C++Primer等书籍进行补充 涉及主要知识点有: ①结构变量所占的内存空间大小为结构中所有成员变量大小之和 ②结构变量的成员变量访问形式为: 结构变量名.成员变量名 ③可以定义指向结构变量的指针 定义形式为:结构名*指针变量名; 综合上面两点,可以知道&std并不是一个结构变量,因此错误!
第二题
这道题我真的不知道C还有函数类型缺省定义。而且输入到VS中分分钟报错! 经过网友的解答,大概明白了C还是存在函数类型缺省定义这一形式的。 具体程序如下:当然,使用它进行打印操作则将出现乱码的现象。 这里提一下用VS2017编译C的形式和可能碰到的问题 1,如何编译C程序 新建->选择空项目->加入.c文件 2,黑洞窗口一闪而过 点击项目,在项目中的属性下拉列表中选择系统选项卡,点击控制台并应用后即可解决该问题
第三题
复习了一下数组部分的内容,学习到了一些数组与指针相关的知识。 为方便后面陈述,假设我们定义了一个一维整形数组a[10]与一个二维整形数组b[2][3]: int a[10]=1,2,3,4,5,6; int b[2][3]=1,2,3,4,5,6; 则有下列相关知识可以获得: 1,数组名(a或者b)为指向 整个数组的地址,通过对数组名+1,则将直接跳过该数组地址,进入该数组后面一个地址。 2,指针运算符:*相当于内容降级,而地址运算符:&相当于地址升级。 比如a为a数组的地址,*a则为a[0]的内容; b为b数组的地址,*b则为b[.][0](注意b[.][0]为指向第一行数组的地址)的内容,**b则为b[0][0]的内容 ,*(*(b+i)+j)则指向b[i][j]的内容。由此可得D选项错误,而*(*(b+i)+j)等价于b[i][j],说明C选项正确。
第四题
当时的想法是默认的话,应该是没确定值,可能类似于动态内存分配之类的;但是too young too simple;下面网友解答:编译器会自动补齐最接近数组个数的数组。第五题
神坑啊这道题,注意#define和赋值是不同的!!是不同的!!是不同的!! 百度百科中: 宏定义是替换,不做计算,也不做表达式求解。 所以只是一个简单的替换 N为2的另外名称, M为N+1表达式 NUM的值为 (M+1)*M/2= (N+1+1)*N+1/2=4*2+1/2=8+1/2 然后取整,得到8;而不是传说中的6!第六题
这道题我当时是蒙的,原因是连%d是干嘛用的都忘了:%xx为转义说明符,具体见上。 该题首先定义了两个字符串数组:str1和str2,与两个char类型指针p1,p2,共同指向abc字符串。 ------------------------------------------------------------------------ 为什么会出现前两个不同后两个相同的现象呢? 这是因为内容存放在不同片区的内存空间所导致: 前两个是字符数组,定义在栈上,明显地址不同 ; 字符串常量定义在静态区,仅有一份拷贝,所以后面两个指针指向的地址相同 。第七题
求输出#include<stdio.h>
int main()
char *str[3] = "stra","strb","strc" ;
char*p = str[0];
int i = 0;
while (i < 3)
printf("%s", p++);
i++;
return 0;
复习一下字符串数组的内容:
char类型对指针的处理与int等类型的处理存在较大的不同,对于其他数组而言,数组的名称即为该数组的起始地址;然而直接将char类型的名字用于输出,则将输出对应的数组元素;如果要禁用这一功能,在C++里可以通过强制类型转换得到结果。
----------------------------------------------------------------------------
说一下题,这道题做错源自于对指针的恐惧感,看到char*str[3]中又有char*又有数组,有点犯怵。其实还是一样的剥笋套路:
char *str[3]为包含有三个字符串的数组指针,*str[0]指向"stra".....
定义完char *str[3]后,使char*p指向str[0]。
进入循环部分:
该循环共运行三次(一次起始,两次判断)
第一次循环,打印p的内容:stra
第二次循环,打印p+1的内容tra
第三次循环,打印p+2的内容ra
所以选
stra tra ra
第八题
这道题完全没看懂,再看了一眼应该是后面少了字:发生变化, STL中vector为动态数组,所以可能会自动扩容第九题
这个。。。看错了。。。。第十题
这道题我也是蒙的。。。因为怎么会有负数这种操作?首先补充一下取值范围 short的取值范围为-2^15到2^15-1 long的取值范围为-2^31~2^31-1 unsigned int与long 的取值范围为0~2^32-1 unsigned short的范围为0~2^16-1 2^16=65536
第二:求解 这是一个跑圈追赶的问题:过了一个循环才追上 所以:5k+65536=7k+2
同理,第二问:3+3k+65536=7+7k
第十一题
这个涉及动态内存分配以及回收,我一开始很天真的以为只有new T[]和delete []p对应才能回收完内存, However....关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。
基本类型的对象没有析构函数, 所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。
第十二题
参考链接: C++中struct的构造/析构函数 得出结论:struct与class的区别 1,struct默认权限:public 2,struct没有继承与多态机制!第十三题
D为编译阶段进行替换
该部分对内联函数仍然不是很了解,需要进行继续拓展!
以上是关于C++的练习路1C++的选择题练习的主要内容,如果未能解决你的问题,请参考以下文章