1.两个同型变量互换内容 之前帖子讨论不申请内存空间交换两个变量的值,没仔细考虑。
目前魔法师的答案是:
以下内容为程序代码: a=2; b=3; a=a+b; b=a-b; a=a-b;
但是如果a,b值很大,会有越界的问题出现。
又找了一条路: 以下内容为程序代码: a^=b; b^=a; a^=b;
对类型严格(int,char型不能隐式转换)的语言,转换char型也没有问题了。 若是其他类型的,能否先变换成整形,然后进行互换,再换回来不过还是要申请空间
2.构造与析构,写输出结果
#include <iostream.h>
class A{public:
A(){cout <<" Construct A!" <<endl;}
~A(){cout<< " Distruct A!" <<endl;}
};
voidfn(A a){cout<< "in fn!" << endl;}
void main(){A b;fn(b);}
输出:windows 下:
Construct A!
in fn!
Distruct A!
Distruct A!
linux下:
Construct A!
Construct A!
in fn!
Distruct A!
Distruct A!
3.q-p的值是多少?把数组定义成char,int 类型的(指针不变),又会是多少呢?
#include <stdio.h>
#include <string.h>
void main()
{
double a[3]; a[0]=0; a[1]=1; a[2]=2;
double *p, *q;
p=a; q=&a[2];
printf("p address: %d/n",p);
printf("q address: %d/n",q);
printf("q-p value: %d/n",q-p);
printf("a[q-p]=: %f/n", a[q-p]);}
结果∶(假设p=1234500)
P=1234500
Q=1234508
q-p=2
前辈的解释:
HP Unix 系统下
sizeof(char) = 1sizeof(int) = 4sizeof(double) = 8这里的 1,4,8对应的是Byte,1Byte = 8 bits对于32位处理器32bits作为一个处理单元,也就是说char只有1/4个处理单元,int有1个处理单元,double有2个处理单元由此,double[2]-double[0] =2int[2]-int[0] = 1(实际占用1.5个存储单元)char[2]-char[0] = 0 (3个char都在一个存储单元内)
个人见解:望指正
(1.p和q不是double型的十进制数,而是double型的指针,运算规则和十进 制数不同
(2.用十进制打印时只是显示所代表的地址,所以差8个地址(8个byte)
(3.两者做运算时则按指针运算,不是按十进制运算,是按所指数据的类型大小为单元进行运算,既此时差2个单元(2个double)
(4.跟处理器的位数有关系的是地址的差值(8),而不是单元的差值(2)
因此只要数据和指针类型相同时,都是差2个单元
而当两者不同时:
-------------------------------------------------------
icecream在2005-2-25 15:57:59说道:
说明一下,我只是修改了数组的类型,如果保持指针类型和数组类型一致的话结果都是2,我认为这一点一楼的没说清。
----
可我在unix下的执行结果就是2,0,1,q-p其实就是数组元素a[2]的地址减去a[0]的地址,我就是不太明白为什么char的时候结果是0,请指教。---------------------------------------------------------
指针是double,而数据是char型时三个char型数据都在一个double单元里,所以p和q指向同一double单元虽然两者地址的十进制差为2,但是按double单元运算时,4个地址差才算一个单元差所以不够一个单元差,默认为0,就象< 1的小数取整时为0一样单元差值的变化取决于数据类型和指针类型两个因素跟处理器的位数有关系的是地址的差值(8),而不是单元的差值(2)
几个c++的考题
最新推荐文章于 2021-09-10 18:08:31 发布