}
system(“pause”);
return 0;
}
输出正确结果为:
解析:
调用void set(A * d,int ind);函数时,d接收实参的值,即data数组的首地址,然后按“类A”的存储方式对数组的连续存储空间进行下标操作,这样就会把data地址开始的前4*4个字节分别解析成4个int型数据。
9、1000瓶水中有一瓶是有毒的,老鼠喝任意量的毒水都会在一周后死亡,问至少用多少只老鼠可以测出哪瓶水是有毒的?(B)
A、9 B、10 C、 12 D、999
解析:
对1000水进行编码,需要10位
10只老鼠分别代表10个有效位
对每一瓶水分别由对应编码的老鼠喝,
最后死亡老鼠的有效们置1,活着老鼠的有效们置0,则该编码对应的水即为有毒的水。
10、下列项返回1的是(B、C、D)
A、主函数正常结束返回1
B、return (7&1);
C、char * str=”Microsoft”; return str==”Microsoft”
D、return “Microsoft”==”Microsoft”
E、None of the above
解析:C++编译器会对字符常量的存储进行优化
11、32位有符号整数F和G是由F=X/2和G=X>>1得到,如果F不等于G,说明什么?
A. 编译错误
B. X是奇数
C. X是负数
D. F-G=1
E. G-F=1
解析:不太会,不过C应该是正确的,其他选项不会
一、下面的题目你能全做对吗?
1.7/4=
2.7/(-4)=
3.7%4=
4.7%(-4)=
5.(-7)/4=
6.(-7)%4=
7.(-7)/(unsigned)4=
答案:
1
-1
3
3
-1
-3
1073741822
二、除法的取整分类
除法的取整分为三类:向上取整、向下取整、向零取整。
1.向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,7/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2
2.向下取整:向-∞方向取最接近精确值的整数。在这种取整方式下,7/4=1,7/(-4)=-2,6/3=2,6/(-3)=-2
3.向零取整:向0方向取最接近精确值的整数,换言之就是舍去小数部分,因此又称截断取整。在这种取整方式下,7/4=1,7/(-4)=-1,6/3=2,6/(-3)=-2
通过观察可以发现,无论是向上取整还是向下取整,(-a)/b==-(a/b)都不一定成立。这给程序设计者带来了极大的麻烦。而对于向零取整,(-a)/b==-(a/b)是成立的,以此,C/C++采用这种取整方式。
、负数取模
回想小学的公式:被除数÷除数=商……余数。
由此可知,余数=被除数-商×除数 (*)
对C/C++而言,(*)式依然成立。并且,该式是解决负数取模问题的关键。
例一:7%(-4)=
解:由C/C++向零取整的整除方式可知,7/(-4)=-1;由(*)式知,余数=7-(-4)*(-1)=3.所以,7%(-4)=3
例二:(-7)%4=
解:由C/C++向零取整的整除方式可知,(-7)/4=-1;由(*)式知,余数=(-7)-4*(-1)=-3.所以,(-7)%4=-3
例三:(-7)%(-4)=
解:由C/C++向零取整的整除方式可知,(-7)/(-4)=1;由(*)式知,余数=(-7)-(-4)*1=-3.所以,(-7)%(-4)=-3
四、相关知识的拓展
1.对于有符号整数与无符号整数间的除法,C/C++会将有符号整数转换为无符号整数,需要特别注意的是,符号位并没有丢失,而是变成了数据位参与运算。这就是(-7)/(unsigned)4不等于-1,而等于1073741822的原因。
2.编译器对除法的优化
①在“无优化”条件下,编译器会在不影响正常调试的前提下,对除法进行简单的优化。
A.“常量/常量”型除法:编译器会直接计算出结果。
B.“变量/变量”型除法:无优化。
C.“变量/常量”型除法:若常量≠2^n,无优化;否则,除法将被转换为右移运算。由于由右移运算实现的整除实质上是向下取整,所以编译器会通过一些附加的指令在不产生分支结构的情况下将向下取整转换为向零取整。
以【变量/2^3】为例,反汇编代码如下:
mov eax,被除数
cdq ;若eax<0,则edx=0xFFFFFFFF;否则edx=0
and edx,7 ;若eax<0,则edx=7;否则edx=0
add eax,edx ;若eax<0,【(eax+7)/(2^3)】向下取整的值 与 【eax/(2^3)】向零取整的值相等,从而实现向零取整
sar eax,3 ;右移,完成除法
②在“O2优化”条件下,“常量/变量”型除法中,常量若≠2^n,也可以优化。此时,除法将被转换为乘法与右移的结合形式。例如,a/b=a*(1/b)=a*((2^n)/b)*(1/(2^n)),其中,((2^n)/b为MagicNumber,由编译器在编译过程中算出。这样a/b就变成了(a*MagicNumber)>>n,n的值由编译器选取。需要注意的是,本公式只是除法优化中的一个典型代表,编译器会根据除数对公式进行调整,但基本形式与原理是类似的。
12、3*4的格子有几个矩形?(D)
A.18
B.20
C.40
D.60
E.都不对
解析:m*(m+1)*n*(n+1)/4
13、一条线把平面分成两块,两条线把平面分成四块,如果任意两条线不平行,。。。100条线分成多少块
A、5051
B、5052
C、5510
D、5511
解析: 线数(n) 平面数(f(n))
1 2
2 4
3 7
4 11
……
N-1 f(n-2)+(n-1)
N f(n-1)+N
所以100线应该有100+99+……+2+2=1+(1+100)*100、2=5051
14、哪个排序是稳定的?(A、C)
A. Bubble
B. QuickSort
C. Merge
D. Heap
E. Select
15、MVC以下哪个说法正确?
A. Model是表示数据和业务逻辑
B. View是用户交互。。。
C. Controller。。。
D. Model用于get和post用户的输入,然后交给控制器
E. 以上都不对
解析:
16、知道以下哪种遍历可以还原二叉树:(A、C)
A. 先序和中序
B. 先序和后序
C. 后序和中序
D. 后序
解析:
17、N个字符的string,每个字符都不相同,它共有多少个子串?(C)
A.n+1
B.2^n
C.n(n+1)/2
D.n!
解析:这道 题应该没有考虑空串
18、Update set copy = copy+1 where authorID in
Select authid from table groupby authorID
Having sum(copy) <= 8
对几条数据产生变化:(B)
Xx XX XXX copy authorID