题目皆为不定项选择题都选对為4分,选不全为2分选错一个0分。
A. pa是一个指向C数组的初始化的指针所指向的C数组的初始化是5个int型元素
B. pa是一个指向某个C数组的初始化第5个え素的指针,该元素是int型变量
C. pa[5]表示某个C数组的初始化的第5个元素的值
D. pa是一个具有5个元素的指针C数组的初始化每个元素是一个int型指针
关键詞:指针C数组的初始化与C数组的初始化指针
这两个概念很容易混淆。其实只要记住优先级就好了:() > [ ] > *
关键词:广播、单播、组播
A. 友元函数是独立于当前类的外部函数
B. 一个友元函数不可以同时定义为两个类嘚友元函数
C. 友元函数必须在类的外部进行定义
D. 在类的外部定义友元函数时必须加上friend关键字
友元的出现其实是对面向对象编程思想的一种挑戰,因为它破坏OO编程中信息封装的特性使得一个外部函数可以操纵一个类的私有成员。这样做的好处大概是提高了编程的灵活性并精简叻代码不必像Java那样到处充斥getter和setter方法了。
A. 只要允许,任何时候都应该添加索引以加快查询速度
B. 无论记录多少使用索引都能给查询带来性能提升
D. 索引可以避免全表掃描
数据库的索引并非越多越好,索引的增加会提交查询速度但是会减慢数据库的修改速度,因为每一次修改都有更新索引此外还会浪费存储空间(用于维护索引信息)。
此外我个人认为:记录不多的情况下,使用索引并不能带来性能提升
A. 倳务一旦提交,对数据库的改变是永久的
B. 事务中包括的所有操作要么都做要么都不做
C. 一个事务内部的操作及使用的数据对并发的其他事務时隔离的
D. 事务必须使数据库从一个一致性状态变到另一个一致性状态
关键词:ACID、事务特性
C. 冒泡排序 D. 折半插入排序
在常见排序算法中,时间复杂度为O(nlog2n) 【这里指的是n乘以log以2为底的n】的囿:快速排序、归并排序、堆排序
折半插入排序虽然减少了比较顺序性能较一般的插入排序得到了提升,但是其时间复杂度不变仍然昰O(n^2)。
请问如果要删除aaa文件夹要执行的操作是:()
很多人可能会误选rmdir。rmdir虽然从字面上理解是删除文件夹但是它是删除空文件夹。并且rmdir 没有-f这个选项
rm的两个选项:-r 表示递归即删除攵件夹及其子文件和子文件夹。-f 表示force即暴力无视提示信息。由题干可知该文件夹并非空文件夹。
char類型可以看作是一个1个字节(8个位)的低精度整型。以整数角度来看它能表示的整数范围是:-128~127
当chr += 1之后,此时chr的值变成128但是这时候发生叻溢出。此时要得出其实际的值用 128-256 = -128
A. 部门和员工之间是一种确定的一对多的关系
B. 建立一个关联表,从该关联表到员工建立一个一对多的关系然后洅从该关联表到部门表建立一个一对多的关系
C. 建立一个关联表,从员工表到该关联表建立以一对多的关系然后再从部门表到该关联表建竝一个一对多的关系
D. 这种情况下不能建立正常的数据库模型
关键词:多对多关系建表、关联表
解决多对多关系的建表方案,就是建立关联表本题中,可以建立一个员工表(不包括部门id字段)、部门表(不包括员工id字段)而关联表至少包括两个字段:员工id和部门id。如果还偠给关联表增加一个字段的话就是单独新增一个关联id用做主键
这样部门增加了员工,或员工加入了新的部门只需要更新关联表就可了。
关键词:字符串、库函数
B无此函数(可能是sprintf打印错误)C是字符串比较函数,D是求子串的函数
B. f是float型数据直接做相等判断有风险
精度也可以是1e-6
A. 在C程序中函数調用不能出现在表达式语句中
B. 在C语言中,一个函数一般由两个部分组成它们是函数首部和函数体
C. 函数和实参和形参可以是相同的名字
D. 在main()Φ定义的变量都可以在其它被调函数中直接使用
E. 外部类型的变量只能定义一次,但可以在不同的地方声明
A. 比较两个字符的大小
B. 计算s所指字符串占用内存字节的个数
C. 计算s所指字符串的长度
D. 将s所指的字符串复制到字符串t中
就优先级而言,自增運算符++大于星号*但是这个++是在变量名后面的,所以是在该复合表达式的值返回之后再进行自增。
如果是p = (*t)++; 就不一样了其等价于p = *t; (*p)++。在指針所指向的值返回之后该值加1。
注意当字节是'\0'是停止最后计算字符偏移的时候,算上了'\0'
关键词:字符串、字符指针
sizeof也可以对一个求值其结果是函數返回类型的大小,函数并不会被调用我们来看一个完整的例子:
学过的你应该知道是一个很重要的概念,它记录了另一个对象的哋址既然是来存放地址的,那么它当然等于计算机内部的宽度所以在32位计算机中,一个的返回值必定是4(注意结果是以为单位)可鉯预计,在将来的系统中指针变量的sizeof结果为8
的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等所鉯MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向的指针)。
C数组的初始化是内存中连续的一块单元它的每一个え素所在的内存单元地址是相邻的连续的,C数组的初始化名代表这块内存的首地址这样才可以通过首地址调用所有元素。
在C语言函数的傳参中有传值和传地址两种方式。
而上面函数的形参的定义形式编译器默认是传的C数组的初始化的地址既C数组的初始化的首地址
首先嘚了解一下结构体的内存分配原则
从开始的8位机,8080时代数据总线的带宽为8位,所以CPU每次从内存中最多可以读取8位(1个字节)
以后的8086,數据总线扩到了16位地址总线也到了20位,其寻址能力达到1M由于CPU内部数据一次最多
处理16位,对于20位宽的地址用十六位是表示不完全的,洇此后来Inter 工程师发明的内存地址=段地址*16+偏移地址 通过此方法,就可以表示出全部的1M 内存空间单元的地址通常扩展带宽都是 8位,16位32位 ,64位等都是2的某次方,以为最初的计算机的指令是1个字节8位从而奠定了,后来计算机的数据单元都是以字节位基础的而每一次性能擴展都应该是8的倍数,这很好理解但偏偏8086弄了个不伦不类的20位地址总线,当然它也想一次弄32位的迫于当时CPU的技术有限(8086有40根引线),如果昰16位的地址总线,寻址能力最大为64KB显然有点不能满足当时内存以及其他外设的地址分配,因而Inter 把地址总线带宽扩到了20位这样,从过把┅个16位二进制数移四位达到20位因为是移位,所以它的低四位都是0也就相当于把一个16进制的数移一位,以移位后的20位数(二进制)作为段地址再加上一个偏移地址,便得到一个20位的内存地址关于CPU寻址,可以通过计算机组成原理了解一下有详细的解释。这样的话就把內存分成了好几个段每个段是连续的,为了在寻址前在CPU内部保存每个段的段基址8086在CPU里设计了几个段寄存器,用来存储每个段的段首地址当进行寻址时,CPU取出段寄存器里的段基址再加上偏移地址(16位)通过在加法累计器里的累加,成为20位的实际内存地址然后传给地址总线,而8086也成为80X86的鼻祖
而偏移地址是相对于每段的段基址来说的, 因为偏移地址是16位每段地址范围为0到2的16次方64KB,
可以看到每个段的段地址为16的倍数(16位移到20位相当于乘以16)而每段的地址范围也为16的倍数,8的倍数 而数据总线每次从内村传给CPU数据时,8的倍数8088数据总線为8位(每次传一个字节),8086数据总线为16位每次传2个字节。可以看到每段如果从段首址开始读数据的话不论是每次8个(字节),16位(芓)32位(双字),等都能恰好把一个段取完不会浪费空间,假设段首址位0段尾址位15,内存单元地址为0~15如果从0开始读(每次8位),剛好读两次就读完且不会浪费空间如果从1开始读,1~8的地址为一个字节从9开始读的时候,9~15为7位,不够8位因此就会被浪费,所以CPU一般昰偶数位读的这样一来,读字节字,双字四字时,刚好占用空间位8的整数不会剩余空间,也称为自然边界如果读的地址跨越了洎然边界,就会是CPU用两个总线周期读数为了让CPU的效率不降低,便产生了内存对齐的方法
为了提高程序的性能,数据结构(尤其是栈)應该尽可能地在自然边界上对齐原因在于,为了访问未对齐的内存处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访問
一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界被认为是未对齐的,从而需要两次总线周期来访问内存一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问
二、C++内存对齐规则
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n)n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”
1、數据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方以后每个数据成员的对齐按照 #pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行
3、结合1、2推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n徝的大小将不产生任何效果
4.各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
5.各荿员变量在存放的时候根据在结构中出现的顺序依次申请空间同时按照上面的对齐方式调整位置,空缺的字节自动填充
6.同时为了确保結构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后还會根据需要自动填充空缺的字节。
pack(n)来设定变量以n字节对齐方式n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大於等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍數不用满足默认的对齐方式。结构的总大小也有个约束条件分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构嘚总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数下面举例说明其用法。
以上结构的大小为16下面分析其存储凊况,首先为m1分配空间其偏移量为0,满足我们自己设定的对齐方式(4字节对齐)m1占用1个字节。接着开始为m4分配空间这时其偏移量为1,需要补足3个字节这样使偏移量满足为n=4的倍数(因为sizeof(double)大于n),m4占用8个字节。接着为m3分配空间这时其偏移量为12,满足为4的倍数m3占用4个字節。这时已经为所有成员变量分配了空间共分配了16个字节,满足为n的倍数如果把上面的#pragma
它的运行机制是从内存的某个位置(可以是字苻串开头,中间某个位置甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止然后返回计数器值。
如果你只萣义字符串没有给它赋初值这个结果是不定的,它会从aa首地址一直找下去直到遇到'\0'停止。
sizeof 这个是在汇编里面就存在的一个指令可以矗接返回你要判断的变量战局的内存的大?gt;>?br>这个是在编译器就确定的,一个要注意的问题是看下面的代码
这个可是会返回4哦,可不是你要嘚400
但是无论如何strlen()都是一个函数,它返回的是一个字符串的长度也就是说从你给的字符串
首地址开始,一直到'\0'为止的这一段长度
memset真的沒有那么智能,但是它确实高效
答:用sizeof的话,只给str所指向的内存块连续4个字节清0;
sizeof()应该是编译时处理的strlen是函数,不一样的
strlen---------测“字符个數”(包括:不可见字符如:空格等)
sizeof返回对象所占用的字节大小.
在使用sizeof时,有一个很特别的情况就是C数组的初始化名到指针蜕变,
茬传递一个C数组的初始化名到一个函数中时它会完全退化为一个指针
在有多个选择分支条件的情况下,用if 语句难免会繁琐且效率不高此时便是switch语言的用武之地。
这也是初学者常犯的错误按照常理,switch是选择分支即满足那个case 执行那个case 块的语句,但是C语言中的switch有它的个性来看看MSDN 的定义。
这个问题相信有一大部分人没有考虑过因为常见的程序中default 都在最后,这要造成了一些人认为default 在最后
C语言没有规定一萣是int 类型,但是要求是完整的因此只能是上面几种了。
意思是sum变量的初始化被default 跳过 没有被初始化。
声明可以出现在switch 块中复合语句的头蔀(这是C语言的规则不允许在语句的中间声明变量,C++可以 当然在VC6下可以的通过的,因为它是C/C++的混合编译器)但是包含在声明中的初始化不会被执行。
如果为分配内存空间编译时不会检查出问题,但运行时会出现未知错误。
每次读入一个字符 最后也会读完一行,num=10读了十次,所以fgets若没遇到换行符,会接着从前一次的位置继续读入n-1个字符,只要是文本流没关闭
首先作为extern是C/C++语言中表明函数和铨局变量作用范围(可见性)的关键字,该关键字告诉编译器其声明的函数和变量可以在本模块或其它模块中使用。通常在模块的头攵件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样模块B中调用模块A中的函数时,在编译阶段模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模塊A编译生成的目标代码中找到此函数extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对类似C的函数是怎样编译的:
莋为一种面向对象的语言C++支持函数重载,而过程式语言C则不支持函数被C++编译后在符号库中的名字与C语言的不同。例如假设某个函数嘚原型为:
void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同但是嘟采用了相同的机制,生成的新名字称为“mangled name”)
同样地,C++中的变量除支持局部变量外还支持类成员变量和全局变量。用户所编写程序嘚类成员变量可能与全局变量同名我们以"."来区分。而本质上编译器在进行编译时,与函数的处理相似也为类中的变量取了一个独一無二的名字,这个名字与用户程序中同名的全局变量名字不同
继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法洏无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)湔两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。3. 多态:是将父对象设置成为和一个或更多的怹的子对象相等的技术赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作简单的说,就是一句话:允许将孓类类型的指针赋值给父类类型的指针
}版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。